You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server查询:显示表所有记录并追加列汇总行的实现方案

没问题,我来给你讲讲在SQL Server里实现「先展示全部记录,末尾追加汇总行」需求的几种实用方法,还会结合示例说明~

假设我们有一张名为Sales的销售表,结构和输入数据如下:

ProductIDProductNameSalesAmountSaleDate
1笔记本50002024-01-01
2鼠标2002024-01-02
3键盘3002024-01-03

预期输出是先显示上面3条明细记录,最后追加一行汇总SalesAmount的总计行:

ProductIDProductNameSalesAmountSaleDate
1笔记本50002024-01-01
2鼠标2002024-01-02
3键盘3002024-01-03
NULL总计5500NULL

方法一:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:02:33