SQL Server查询:显示表所有记录并追加列汇总行的实现方案
没问题,我来给你讲讲在SQL Server里实现「先展示全部记录,末尾追加汇总行」需求的几种实用方法,还会结合示例说明~
假设我们有一张名为Sales的销售表,结构和输入数据如下:
| ProductID | ProductName | SalesAmount | SaleDate |
|---|---|---|---|
| 1 | 笔记本 | 5000 | 2024-01-01 |
| 2 | 鼠标 | 200 | 2024-01-02 |
| 3 | 键盘 | 300 | 2024-01-03 |
预期输出是先显示上面3条明细记录,最后追加一行汇总SalesAmount的总计行:
| ProductID | ProductName | SalesAmount | SaleDate |
|---|---|---|---|
| 1 | 笔记本 | 5000 | 2024-01-01 |
| 2 | 鼠标 | 200 | 2024-01-02 |
| 3 | 键盘 | 300 | 2024-01-03 |
| NULL | 总计 | 5500 | NULL |
方法一:使用UNION ALL(直观易懂)
这种方法逻辑最简单,先查询全部明细记录,再通过UNION ALL追加一条汇总查询的结果。需要注意的是,两边查询的列数、数据类型必须完全匹配。
-- 第一步:查询所有明细记录 SELECT ProductID, ProductName, SalesAmount, SaleDate FROM Sales -- 如果有过滤条件,比如只查2024年数据,在这里加WHERE子句 -- WHERE SaleDate BETWEEN '2024-01-01' AND '2024-12-31' UNION ALL -- 第二步:查询汇总行 SELECT NULL AS ProductID, -- 非数值列用NULL或自定义标识,注意数据类型匹配 '总计' AS ProductName, SUM(SalesAmount) AS SalesAmount, -- 对需要汇总的列求和 NULL AS SaleDate FROM Sales -- 同样要加和上面一致的过滤条件 -- WHERE SaleDate BETWEEN '2024-01-01' AND '2024-12-31';
注意点:
UNION ALL不会去重,比UNION效率更高,适合这里的场景- 如果表数据量很大,这种方法会扫描两次表(一次查明细,一次查汇总),性能略逊于第二种方法
方法二:使用ROLLUP(高效灵活)
SQL Server的ROLLUP是分组汇总的语法,它只需要扫描一次表就能同时返回明细和汇总行,效率更高。配合GROUPING()函数可以区分明细行和汇总行,自定义显示内容。
SELECT -- GROUPING(列)返回1表示该行是该列的汇总行,0表示是明细行 CASE WHEN GROUPING(ProductID) = 1 THEN NULL ELSE ProductID END AS ProductID, CASE WHEN GROUPING(ProductName) = 1 THEN '总计' ELSE ProductName END AS ProductName, SUM(SalesAmount) AS SalesAmount, CASE WHEN GROUPING(SaleDate) = 1 THEN NULL ELSE SaleDate END AS SaleDate FROM Sales -- 过滤条件在这里统一添加 -- WHERE SaleDate BETWEEN '2024-01-01' AND '2024-12-31' GROUP BY ROLLUP((ProductID, ProductName, SaleDate));
原理说明:
ROLLUP((列1,列2,列3))表示把这三个列作为一个整体分组,生成明细行和总计行GROUPING()函数用来标记汇总行,我们可以用CASE语句自定义汇总行的显示文本
如果需要按某个列分组后再显示明细+分组汇总+总计,ROLLUP会更灵活,比如GROUP BY ProductCategory, ROLLUP(ProductID)就能实现分类汇总+总计。
内容的提问来源于stack exchange,提问作者Bala Ranga
相关产品推荐
相关产品推荐

