2017-08-02 97 views
0

此查詢...SQL分組科目號和獲取小計和總計

SELECT ACTNO,SUM(PLAN) AS 'TOTAL PLAN', SUM(FORECAST) AS 'TOTAL FORECAST' 
FROM COST_CENTER 
GROUP BY ACTNO 

我得到如下結果:

ACTNO | TOTAL PLAN | TOTAL FORECAST 
100 | 12000  | 20000   
101 | 12000  | 20000   
200 | 1000  | 1500   
201 | 1200  | 2000   
202 | 900  | 1500   
203 | 700  | 1500   
220 | 1500  | 3500   
300 | 1200  | 2000   
301 | 1000  | 3000 

我需要組合在一起某些帳戶,讓這些羣體小計,然後將所有小計添加到總計。

期望的結果會是這樣的:

ACTNO | TOTAL PLAN | TOTAL FORECAST 
100 | 12000  | 20000   
101 | 12000  | 20000 
     24000  40000   
200 | 1000  | 1500   
201 | 1200  | 2000   
202 | 900  | 1500   
203 | 700  | 1500 
     3800   6500 
220 | 1500  | 3500   
300 | 1200  | 2000   
301 | 1000  | 3000 
     3700   8500 
Total 31500  55000 

這讓我有點接近,但並不完全格式,我想。

SELECT ACTNO, SUM(PLAN), SUM(FORECAST) 
FROM  COST_CENTER 
WHERE (ACTNO IN ('100','101')) 
GROUP BY ACTNO WITH ROLLUP 
... 

ACTNO |   | 
NULL | 24000  | 40000 
100 | 12000  | 20000   
101 | 12000  | 20000 

感謝您的時間和幫助。

回答

2

你有更多的控制與分組集:

SELECT ACTNO, grp, SUM(PLAN), SUM(FORECAST) 
FROM (SELECT cc.*, 
      (CASE WHEN ACTNO IN ('100', '101') THEN 1 
        WHEN ACTNO IN ('200', '201', '202', '203') THEN 2 
        WHEN ACTNO IN ('220', '300', '301') THEN 3 
       END) as grp 
     FROM COST_CENTER cc 
    ) cc 
GROUP BY GROUPING SETS ((ACTNO, grp), (grp),()); 

你或許可以從SELECT刪除grp。 。 。不過,我從來沒有使用過GROUPING SETS,但沒有加入列。

+0

謝謝!這很好。只是好奇,是否有任何方法來填補NULL,並保持他們正確的順序? – mckinney14

+0

您可以使用'COALESCE()'(不是真正推薦的,但懶惰更容易)或使用'GROUPING()'函數來填充'NULL'。如果您不希望行按默認順序排列,則正確的順序有點棘手。 –