SQL 最后一行各列的总和

SQL sum total each column in last row

我希望 SQL 对 TOTAL 中每一列(IPO 和 UOR)的 SUM 排在倒数第二位。最后一个是 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
------------------

一般来说,您希望将总计和 sub-totals 留给您用于显示数据的任何工具,因为它们能够更轻松地处理格式设置。此外,您所需的输出没有相同数量的列(Grand Total 行只有一个数字)所以即使您将其插入同一数据集,列标题也没有意义。

也就是说,您可以通过 with rollup 语句 return 分组总计。这将提供一个额外的行,其中包含该组的总计。如果您的数据中有多个组,您将获得每个组的 sub-total 行和整个数据集的总行:

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 |
+----+-------------+-----+-----+