SQL分组帐号和获取小计和总计

时间:2017-08-02 01:07:29

标签: sql tsql sql-server-2012 ssms

此查询...

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 

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分: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), ());

您可以从grp中删除SELECT。 。 。但是,我从未使用GROUPING SETS而不包括列。

相关问题