Tengo este código que resume la cantidad de un determinado artículo ( itemid) y por su código de fecha del producto ( proddte).
select sum(qty), itemid, proddte
from testtable where ....
group by itemid, proddte
Lo que quiero hacer es obtener el total de todos qtyindependientemente de itemid/proddte. Yo he tratado:
select sum(qty), itemid, proddte, sum(qty) over() as grandtotal
from testtable
where ....
group by itemid, proddte
Pero dice que también debería tener qtyen la group bycláusula. Si hice eso, el resultado no será igual a mi resultado esperado.
No es necesario que se represente como una columna separada, con el mismo valor en cada fila. Se acepta cualquier representación siempre que pueda mostrar el total general.
fuente

GROUP BY ROLLUP((itemid,proddte))produciría el mismo resultado y podría ser menos confuso.itemidIe Es equivalente aGROUP BY GROUPING SETS((),(itemid),(itemid,proddte))GROUP BY ROLLUP(itemid,proddte), por otro lado, de hecho produciría subtotales (adicionales) enitemid(igual queGROUP BY ROLLUP((itemid),(proddte))). Demo en SEDEGROUP BY ROLLUPmenos confuso, pero es bastante subjetivo. También siempre me pongo nervioso cuando leo cosas comoThe non-ISO compliant WITH ROLLUP, WITH CUBE, and ALL syntax is deprecated: por qué tiendo a favorecerGROUPING SETS.Esta también es una sintaxis válida:
Es un poco confuso cuando uno lo ve al principio, pero solo debe recordar que las funciones de la ventana, por ejemplo
sum() over (), se aplican después,group bypor lo que todo lo que puede aparecer en la lista de selección de un grupo por consulta se puede colocar dentro de un agregado de ventana. Entonces (elqtyno puede pero) elsum(qty)puede colocarse dentrosum() over ():Dicho esto, prefiero la
GROUPING SETSconsulta proporcionada por Aaron Bertrand. La suma total debe mostrarse una vez y no en cada fila.También tenga en cuenta que, si bien la suma de sumas se puede usar para calcular la suma total, si desea el recuento total, debe usar la suma de los recuentos (¡y no el recuento de los recuentos!):
Y si uno quisiera el promedio sobre toda la tabla, sería aún más complicado:
porque el promedio de los promedios no es igual al promedio de todos. (Si lo prueba
avg(avg(qty)) over (), verá que puede producir un resultado diferente al gran promedio anterior).fuente
Una posible forma es envolver el primero
GROUP BYen CTE :fuente