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

如何在保留所有明细行的同时对多列求和并显示总计行?

当然可以搞定!你要的就是「保留所有明细,同时追加一行总计」的效果对吧?下面给你两种实用的SQL写法,适配不同的数据库场景:

方法一:用UNION ALL手动拼接明细和总计

这种方法兼容性拉满,几乎所有数据库都支持,思路就是先查所有明细行,再单独查总计行,最后把两个结果合并起来。

假设你的表名叫sales_data,可以这么写:

-- 先查全部明细
SELECT SALES_ID, EMPLOYEE_ID, PRODUCT_ID, SALES_AMOUNT, QUANTITY, DATE
FROM sales_data
UNION ALL
-- 再查总计行,非聚合字段可以用NULL或自定义标识
SELECT NULL AS SALES_ID, NULL AS EMPLOYEE_ID, '总计' AS PRODUCT_ID, 
       SUM(SALES_AMOUNT) AS SALES_AMOUNT, SUM(QUANTITY) AS QUANTITY, NULL AS DATE
FROM sales_data;

执行后就能得到你要的结果:两行明细+一行总计,总计行的PRODUCT_ID显示「总计」,其他不需要聚合的字段设为NULL(你也可以改成更贴合业务的标识,比如如果是特定员工的总计,EMPLOYEE_ID可以保留为123148)。

方法二:用ROLLUP自动生成总计行(适合支持该语法的数据库)

如果你的数据库支持GROUP BY ROLLUP(比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle等),用这个方法更简洁,它会自动帮你生成总计行:

SELECT 
    -- GROUPING函数判断是否是ROLLUP生成的总计行(1表示是总计)
    CASE WHEN GROUPING(SALES_ID) = 1 THEN NULL ELSE SALES_ID END AS SALES_ID,
    CASE WHEN GROUPING(EMPLOYEE_ID) = 1 THEN NULL ELSE EMPLOYEE_ID END AS EMPLOYEE_ID,
    CASE WHEN GROUPING(PRODUCT_ID) = 1 THEN '总计' ELSE PRODUCT_ID END AS PRODUCT_ID,
    SUM(SALES_AMOUNT) AS SALES_AMOUNT,
    SUM(QUANTITY) AS QUANTITY,
    CASE WHEN GROUPING(DATE) = 1 THEN NULL ELSE DATE END AS DATE
FROM sales_data
GROUP BY ROLLUP(SALES_ID, EMPLOYEE_ID, PRODUCT_ID, DATE);

这种方法的好处是如果后续需要加更多分组维度(比如按日期分组再加总计),修改起来更灵活。

小提醒

如果你的查询需要加筛选条件(比如只查某一天的数据),记得在两种方法的查询里都加上相同的WHERE条件,避免明细和总计的数据不一致哦!

内容的提问来源于stack exchange,提问作者TBERMINGHAM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:17:08