J'ai cette requête:
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
actuellement le résultat est:
MAIS je dois ajouter sum
à la fin. J'ai donc essayé avec le rollup:
SELECT Name,datee,SUM (val)
from @t GROUP BY NAME ,datee with ROLLUP
MAIS je n'ai besoin que de la dernière ligne de somme . Je n'ai pas besoin du rapport dans le rapport sum's
Alors, comment obtenir le résultat souhaité?
(Je ne peux pas changer le group by
clause car d'autres en ont besoin aussi, je veux juste ajouter une somme à la fin avec/sans rollup).
C'est possible avec GROUPING SETS
, essaye ça:
SELECT Name,datee,SUM (val)
FROM @t
GROUP BY
GROUPING SETS((NAME ,datee), ())
C'est aussi possible avec ROLLUP()
:
SELECT
Name,
datee,
SUM (val)
FROM @t
GROUP BY
ROLLUP((NAME, datee))
;
WITH ROLLUP
, Ainsi que WITH CUBE
, Sont non standard et obsolètes. (Voir Syntaxe non conforme ISO dans le manuel GROUP BY
.)
Il convient de noter que ROLLUP()
n'est pas pris en charge dans le niveau de compatibilité inférieur à 90 dans SQL Server 2005 ou inférieur à 100 dans SQL Server 2008+, tandis que GROUPING SETS()
l'est.
Si vous voulez juste le total final, ne pouvez-vous pas simplement utiliser un UNION ALL
:
SELECT Name,datee,SUM (val)
from @t
GROUP BY NAME ,datee
union all
SELECT null,null,SUM (val)
from @t
Voir SQL Fiddle with Demo
Ou vous pouvez utiliser une clause WHERE
pour filtrer les lignes avec les valeurs 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
)
Voir SQL Fiddle with Demo
Le résultat est:
| 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 |
Vous pouvez utiliser cette requête:
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
)
)