sql server - multiple - ¿Suma con el servidor SQL RollUP-pero solo el último resumen?
sql group by sum (4)
Tengo esta consulta:
DECLARE @t TABLE(NAME NVARCHAR(MAX),datee date,val money)
insert INTO @t SELECT ''a'',''2012-01-02'',100
insert INTO @t SELECT ''a'',''2012-01-02'',100
insert INTO @t SELECT ''a'',''2012-01-03'',100
insert INTO @t SELECT ''a'',''2012-01-05'',100
insert INTO @t SELECT ''b'',''2012-01-06'',200
insert INTO @t SELECT ''b'',''2012-01-07'',200
insert INTO @t SELECT ''d'',''2012-01-07'',400
insert INTO @t SELECT ''e'',''2012-01-09'',500
insert INTO @t SELECT ''f'',''2012-01-12'',600
SELECT Name,datee,SUM (val)
from @t GROUP BY NAME ,datee
Actualmente el resultado es:
PERO necesito agregar sum
al final. Así que lo intenté con el rollup:
SELECT Name,datee,SUM (val)
from @t GROUP BY NAME ,datee with ROLLUP
PERO solo necesito la última suma de la línea total. No necesito las sum''s
en el informe
Entonces, ¿cómo se puede obtener el resultado deseado?
(No puedo cambiar la cláusula de group by
porque otras personas también lo necesitan, solo quiero agregar una suma al final con / sin resumen).
Es posible con GROUPING SETS
, intente esto:
SELECT Name,datee,SUM (val)
FROM @t
GROUP BY
GROUPING SETS((NAME ,datee), ())
Puede utilizar esta consulta:
SELECT *
FROM ( SELECT Name ,
datee ,
SUM(val) summ
FROM @t
GROUP BY NAME ,
datee
WITH ROLLUP
) A
WHERE ( datee IS NOT NULL
OR ( datee IS NULL
AND name IS NULL
)
)
Si solo desea el total final, ¿no puede simplemente usar UNION ALL
:
SELECT Name,datee,SUM (val)
from @t
GROUP BY NAME ,datee
union all
SELECT null,null,SUM (val)
from @t
O puede usar una cláusula WHERE
para filtrar las filas con los valores null
:
select name,
datee,
total
from
(
SELECT Name,datee,SUM (val) total
from @t
GROUP BY NAME, datee with rollup
) src
where datee is not null
or
(
name is null
and datee is null
)
El resultado es:
| NAME | DATEE | COLUMN_2 |
----------------------------------
| a | 2012-01-02 | 200 |
| a | 2012-01-03 | 100 |
| a | 2012-01-05 | 100 |
| b | 2012-01-06 | 200 |
| b | 2012-01-07 | 200 |
| d | 2012-01-07 | 400 |
| e | 2012-01-09 | 500 |
| f | 2012-01-12 | 600 |
| (null) | (null) | 2300 |
También es posible con ROLLUP()
:
SELECT
Name,
datee,
SUM (val)
FROM @t
GROUP BY
ROLLUP((NAME, datee))
;
WITH ROLLUP
, así como WITH CUBE
, no son estándar y están en desuso. (Consulte la sintaxis que no cumple con las normas ISO en el manual de GROUP BY
).
Se debe tener en cuenta que ROLLUP()
no es compatible con un nivel de compatibilidad inferior a 90 en SQL Server 2005 o inferior a 100 en SQL Server 2008+, mientras que GROUPING SETS()
es.