2013-01-23 11 views
14

mam tej kwerendy:Suma z serwerem SQL RollUP - ale tylko ostatnie podsumowanie?

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 

obecnie wynikiem jest:

enter image description here

ale muszę dodać sum na końcu. Więc próbowałem z pakietu zbiorczego:

SELECT Name,datee,SUM (val) 
    from @t GROUP BY NAME ,datee with ROLLUP 

enter image description here

ale muszę tylko ostatni sumaryczna linię . Nie potrzebuję, aby w raporcie W jaki sposób uzyskać wynik pożądania?

(Nie mogę zmienić klauzuli group by, ponieważ inni też tego potrzebują, po prostu chcę dodać sumę na końcu z/bez pakietu zbiorczego).

sql online is here

Odpowiedz

27

Jest to możliwe dzięki GROUPING SETS, spróbuj tego:

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

SQL Fiddle

+0

@RoyiNamir Nie ma za co, jest to standardowa funkcja TSQL, ale nie jest używana tak często (tak myślę), więc ludzie nie zawsze wiedzą o tym :) –

+0

Naprawdę muszę o tym przeczytać. –

+0

@RoyiNamir Jestem pewna, że ​​znajdziesz w nim zasoby online, przeczytałem o tym w książce (choć nie pamiętam, jak z niej korzystałem). –

4

Jeśli chcesz tylko ostateczną sumę, nie może po prostu użyć UNION ALL:

SELECT Name,datee,SUM (val) 
from @t 
GROUP BY NAME ,datee 
union all 
SELECT null,null,SUM (val) 
from @t 

Zobacz SQL Fiddle with Demo

Albo można użyć WHERE klauzuli filtrować wiersze z wartościami 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 
) 

Zobacz SQL Fiddle with Demo

Wynikiem jest:

| 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 | 
+0

FYI @t jest wynikiem kwerendy. (to nie ma znaczenia), więc trzeba napisać dwa razy. Próbowałem zrobić to za pomocą CTE, ale: http://i.stack.imgur.com/hYhOk.jpg –

+0

@RoyiNamir Cóż, drugi, powinien nad tym pracować, ponieważ nie ma związku Wszystkie – Taryn

9

Możliwe jest również z ROLLUP():

SELECT 
    Name, 
    datee, 
    SUM (val) 
FROM @t 
GROUP BY 
    ROLLUP((NAME, datee)) 
; 

WITH ROLLUP, a także WITH CUBE, są niestandardowe i przestarzałe. (Patrz Non-zgodny z ISO Składnia w instrukcji GROUP BY.)

Należy zauważyć, że ROLLUP() nie jest obsługiwana w poziomie kompatybilności pod 90 w SQL Server 2005 lub pod 100 w SQL Server 2008+, natomiast GROUPING SETS() jest .

1

Możesz użyć tej kwerendy:

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 
      ) 
     ) 
Powiązane problemy