2016-09-22 75 views
2

我有一個查詢按地名和yyyy-mm分組。我想要的是每個月總共有3個地名。例如在看總在三月3「地方」的「共1」的下面是14個,4 + 5 + 5小組中的小計由

place   yyyy-mm   total1  total2  total3 
    A   2016-03   4   4   5 
    B   2016-03   5   1   2 
    C   2016-03   5   4   2 
    A   2016-04   1   3   4 
    B   2016-04   2   3   4 
    C   2016-04   6   2   1 

因此,像這樣

place  yyyy-mm   total1  total2  total3 
    A   2016-03   4   4   5 
    B   2016-03   5   1   2 
    C   2016-03   5   4   2 
    ALL   2016-03   14   9   9 
    A   2016-04   1   3   4 
    B   2016-04   2   3   4 
    C   2016-04   6   2   1 
    ALL   2016-04   9   8   9 
+0

您正在使用的SQL-Server的版本?因爲你可以使用2008年以後的Window-Function'Over()'。 – Nebi

+0

使用sql server 2012 -thanks,這不是我熟悉的函數 – whitz11

回答

2

你也可以使用UNION ALL,但彙總是在可讀性和性能方面更好(不訪問表兩次)

SELECT 
CASE WHEN PLACE IS NULL THEN 'ALL' ELSE PLACE END as place, 
YYYYMM, 
SUM(TOTAL1) AS TOTAL1,SUM(TOTAL2) AS TOTAL2,SUM(TOTAL3) AS TOTAL3 
FROM #TEMP 
GROUP BY YYYYMM,PLACE 
WITH ROLLUP 
HAVING GROUPING(YYYYMM)=0 

輸出:

place YYYYMM TOTAL1 TOTAL2 TOTAL3 
A  2016-03 4  4  5 
B  2016-03 5  1  2 
C  2016-03 5  4  2 
ALL  2016-03 14  9  9 
A  2016-04 1  3  4 
B  2016-04 2  3  4 
C  2016-04 6  2  1 
ALL  2016-04 9  8  9 
+0

我的yyyy-mm列設置像這樣Convert(char(7),[DateTimeOfCall],121)「yyyy-mm」我該如何插入這到'有分組'正確嗎? – whitz11

+0

@ whitz11:這是如何偏離你預期的輸出,它是一個新的問題,問一個新的問題或更新問題的細節 – TheGameiswar

2

使用集團通過與ROLLUP

DECLARE @tblTest AS Table(
    Place VARCHAR(5), 
    YearMonth DATE, 
    Total1 INT, 
    Total2 INT, 
    Total3 INT 
) 

INSERT INTO @tblTest VALUES 
('A','2016-03-01',4,4,5), 
('B','2016-03-01',5,1,2), 
('C','2016-03-01',5,4,2), 
('A','2016-04-01',1,3,4), 
('B','2016-04-01',2,3,4), 
('C','2016-04-01',6,2,1) 

;with X AS 
(
    SELECT 
     Place, 
     YearMonth,   
     SUM(Total1) AS Total1, 
     SUM(Total2) AS Total2, 
     SUM(Total3) AS Total3 
    FROM @tblTest 
    GROUP BY YearMonth,Place WITH ROLLUP 
) 
SELECT 
    CASE ISNULL(Place,'') WHEN '' THEN 'ALL' ELSE Place END AS Place, 
    YearMonth, 
    Total1, 
    Total2, 
    Total3 
FROM X 
WHERE X.YearMonth IS NOT NULL 

輸出:

enter image description here

3

你可以使用GROUP BY GROUPING SETS

CREATE TABLE #MyTable(Place VARCHAR(10), Date VARCHAR(20), Total1 INT, Total2 INT, Total3 INT) 

INSERT INTO #MyTable (place, [date], Total1, Total2, Total3) 
VALUES(  'A',   '2016-03' ,   4,   4 ,   5) 
     , ('B',   '2016-03',   5,   1,   2) 
     , ('C',   '2016-03',   5,   4,   2) 
     , ('A',   '2016-04',   1,   3,   4) 
     , ('B',   '2016-04',   2,   3,   4) 
     , ('C',   '2016-04',   6,   2,   1) 


SELECT 
    [Date] 
    , ISNULL(Place , 'Total') 
    , SUM(Total1) AS Total1 
    , SUM(Total2) AS Total2 
    , SUM(Total3) AS Total3 
FROM #MyTable 
GROUP BY GROUPING SETS 
(Place, [Date]) 
, ([Date]) 


DROP TABLE #MyTable 
2

ŧ他可以通過使用GROUPING SETS來實現。

查詢

select 
    coalesce([place], 'ALL') as [place], 
    [yyyy-mm], 
    sum([total1]) as [total1], 
    sum([total2]) as [total2], 
    sum([total3]) as [total3] 
from [your_table_name] 
group by grouping sets(([place], [yyyy-mm]), ([yyyy-mm])); 

Find a demo here