2017-08-02 14 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()'を使って 'NULL'を埋めることができます(実際には推奨されませんが、怠け者にとっては簡単です)、 'GROUPING()'関数を使うことができます。行をデフォルトの順序にしたくない場合は、正しい順序が少し厄介です。 –