web-dev-qa-db-fra.com

Somme avec SQL Server RollUP - mais seulement le dernier résumé?

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:

enter image description here

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

enter image description here

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).

sql online est ici

18
Royi Namir

C'est possible avec GROUPING SETS, essaye ça:

SELECT  Name,datee,SUM (val) 
FROM    @t 
GROUP BY 
        GROUPING SETS((NAME ,datee), ())

SQL Fiddle

33
Ivan G

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.

10
Andriy M

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 |
4
Taryn

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
             )
        )
1
Shyam Prasad