SQL汇总了最后一行中的每一列

问题描述 投票:0回答:1

我希望SQL for SUM中的每一列(IPO和UOR)在TOTAL中排在倒数第二位。和GRAND TOTAL(Sum IPO + UOR)在最后一个。非常感谢

No  Code   IPO UOR
----------------------
1   D173    1   0
2   D176    3   0
3   D184    1   1
4   D185B   1   0
5   D187    1   2
6   F042    3   0
7   ML004   12  3
8   TTPMC   2   0
9   Z00204  1   0
------------------
TOTAL (NOS) 25  6
-------------------------
GRAND TOTAL (NOS)   31  

这是我的代码,:

SELECT  
SUM(CASE WHEN IPOType = 'IPO' THEN 1 ELSE 0 END) as IPO,
SUM(CASE WHEN IPOType = 'UOR' THEN 1 ELSE 0 END) as UOR  
FROM IPO2018 
GROUP BY OriProjNo 

它可以这样显示

No  Code   IPO UOR
----------------------
1   D173    1   0
2   D176    3   0
3   D184    1   1
4   D185B   1   0
5   D187    1   2
6   F042    3   0
7   ML004   12  3
8   TTPMC   2   0
9   Z00204  1   0
------------------
sql tsql group-by sum rollup
1个回答
0
投票

一般来说,您希望将总计和小计保留在您呈现数据的任何工具中,因为它们将能够更轻松地处理格式化。另外,你想要的输出没有相同的列数(Grand Total行只有一个数字),所以即使你把这个挂钩到同一个数据集,列标题也没有意义。

也就是说,您可以通过with rollup语句返回组总计。这将为该组的总计提供额外的行。如果数据中有多个组,您将获得每个组的小计行和整个数据集的总行:

declare @t table(c nvarchar(10),t nvarchar(3));
insert into @t values ('D173','IPO'),('D176','IPO'),('D176','IPO'),('D176','IPO'),('D184','IPO'),('D184','UOR'),('D185B','IPO'),('D187','IPO'),('D187','UOR'),('D187','UOR'),('F042','IPO'),('F042','IPO'),('F042','IPO'),('TTPMC','IPO'),('TTPMC','IPO'),('Z00204','IPO'),('ML004','UOR'),('ML004','UOR'),('ML004','UOR'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO'),('ML004','IPO');

select row_number() over (order by grouping(c),c) as n
    ,case when grouping(c) = 1 then 'TOTAL (NOS)' else c end as c
    ,sum(case when t = 'IPO' then 1 else 0 end) as IPO
    ,sum(case when t = 'UOR' then 1 else 0 end) as UOR
from @t
group by c
with rollup
order by grouping(c)
        ,c;

输出:

+----+-------------+-----+-----+
| n  |      c      | IPO | UOR |
+----+-------------+-----+-----+
|  1 | D173        |   1 |   0 |
|  2 | D176        |   3 |   0 |
|  3 | D184        |   1 |   1 |
|  4 | D185B       |   1 |   0 |
|  5 | D187        |   1 |   2 |
|  6 | F042        |   3 |   0 |
|  7 | ML004       |  12 |   3 |
|  8 | TTPMC       |   2 |   0 |
|  9 | Z00204      |   1 |   0 |
| 10 | TOTAL (NOS) |  25 |   6 |
+----+-------------+-----+-----+
© www.soinside.com 2019 - 2024. All rights reserved.