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 qty
independientemente 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 qty
en la group by
clá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.itemid
Ie 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 ROLLUP
menos 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 by
por 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 (elqty
no puede pero) elsum(qty)
puede colocarse dentrosum() over ()
:Dicho esto, prefiero la
GROUPING SETS
consulta 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 BY
en CTE :fuente