【问题标题】:SQL Grouping Acct Numbers and Getting Subtotals and Grand TotalSQL 分组科目编号和获取小计和总计
【发布时间】:2018-01-09 00:45:55
【问题描述】:

这个查询...

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 

感谢您的时间和帮助。

【问题讨论】:

    标签: sql tsql sql-server-2012 ssms


    【解决方案1】:

    您对分组集拥有更多控制权:

    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 而不包括该列。

    【讨论】:

    • 谢谢!那效果很好。只是好奇,有什么方法可以填充 NULL 并使它们保持正确的顺序?
    • 您可以使用COALESCE()(不是很推荐,但对懒人来说更容易)或使用GROUPING() 函数来填充NULLs。如果您不想按默认顺序排列行,那么正确的顺序会有点棘手。
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多