2013-01-23 11 views
14

Tôi có truy vấn này:Tổng hợp với máy chủ SQL RollUP - nhưng chỉ tóm tắt cuối cùng?

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 

hiện kết quả là:

enter image description here

NHƯNG tôi cần phải thêm sum ở cuối. Vì vậy, tôi cố gắng với rollup:

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

enter image description here

NHƯNG tôi chỉ cần cuối cùng tổng tổng dòng . Tôi không cần số trong báo cáosum's

Vậy làm thế nào để có được kết quả mong muốn?

(Tôi không thể thay đổi điều khoản group by vì những người khác cũng cần nó, tôi chỉ muốn cộng tổng số vào cuối có/không có rollup).

sql online is here

Trả lời

27

Có thể với GROUPING SETS, hãy thử này:

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

SQL Fiddle

+0

@RoyiNamir Bạn được chào đón, đó là tính năng TSQL tiêu chuẩn, nhưng nó không được sử dụng thường xuyên (tôi đoán) để mọi người không biết về nó :) –

+0

Tôi thực sự cần phải đọc về nó. –

+0

@RoyiNamir Tôi chắc chắn bạn sẽ tìm thấy tài nguyên về nó trực tuyến, tôi đọc về nó trong một cuốn sách (mặc dù tôi không thể thực sự nhớ sử dụng nó). –

4

Nếu bạn chỉ muốn tổng cuối cùng, có thể bạn không chỉ cần sử dụng một UNION ALL:

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

Xem SQL Fiddle with Demo

Hoặc bạn có thể sử dụng một điều khoản WHERE để lọc hàng với các giá trị 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 
) 

Xem SQL Fiddle with Demo

Kết quả là:

| 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 là kết quả của một truy vấn. (nó không quan trọng) vì vậy bệnh phải viết nó hai lần. Tôi đã cố gắng làm điều đó với CTE nhưng: http://i.stack.imgur.com/hYhOk.jpg –

+0

@RoyiNamir Tốt thứ hai, nên làm việc vì không có liên minh nào cả – Taryn

9

Cũng có thể với ROLLUP():

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

WITH ROLLUP, cũng như WITH CUBE, không chuẩn và không được dùng nữa. (Xem Non-ISO Compliant Cú pháp trong cuốn hướng dẫn GROUP BY.)

Cần lưu ý rằng ROLLUP() không được hỗ trợ ở mức phù hợp dưới 90 trong SQL Server 2005 hoặc dưới 100 trong SQL Server 2008+, trong khi GROUPING SETS() là .

1

Bạn có thể sử dụng truy vấn này:

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