如何在Union ALL的SQL结果中添加总计行,合并55090.25与1522.8?
给UNION ALL结果添加总计行的几种方法
嘿,我来帮你搞定这个需求!针对你的情况,要给UNION ALL得到的两个数值添加总计行,有几种实用的方法,我一个个给你拆解:
方法1:用CTE(公共表表达式)先存结果,再追加求和行
这是最清晰、通用的方法,不管你的UNION ALL里有多少个查询都适用。先把UNION ALL的结果临时存起来,再对这个临时数据集求和,最后用UNION ALL把求和结果追加到后面:
WITH union_results AS ( -- 这里替换成你实际的UNION ALL查询 SELECT 55090.25 AS value UNION ALL SELECT 1522.8 AS value ) -- 先输出原始的两个结果行 SELECT value FROM union_results UNION ALL -- 再输出总计行 SELECT SUM(value) AS value FROM union_results;
执行后你会得到三行结果:
- 55090.25
- 1522.8
- 56613.05(两个数的总和)
方法2:如果原查询是分组统计,用ROLLUP自动生成总计
如果你的两个结果是从分组查询里得到的(比如按类别分组求和),可以用GROUP BY ... WITH ROLLUP来直接生成总计行,不用额外写UNION ALL,效率更高:
假设你的原查询是这样的:
SELECT category, SUM(amount) AS value FROM your_table WHERE category IN ('类型1', '类型2') GROUP BY category;
改成带ROLLUP的版本:
SELECT -- 当GROUPING(category)=1时,说明是总计行,显示“总计”,否则显示类别名 CASE WHEN GROUPING(category) = 1 THEN '总计' ELSE category END AS category, SUM(amount) AS value FROM your_table WHERE category IN ('类型1', '类型2') GROUP BY category WITH ROLLUP;
这样结果里会自动多出一行category='总计'的行,值就是两个分组的总和。
UNION ALL结果求和/总计的通用思路
总结一下,实现UNION ALL结果的求和或总计,核心思路有三种:
- 临时存储法:用CTE或者临时表把
UNION ALL的结果存起来,只执行一次原始查询,再基于这个临时数据集做求和(推荐,清晰又高效) - 分组扩展法:如果原查询是分组统计,利用数据库的
ROLLUP/CUBE语法自动生成总计行,这是最优雅的方式 - 重复计算法:把
UNION ALL的结果作为子查询,分别查询原始行和求和行(不推荐,会重复执行两次UNION ALL,效率较低)
需要注意的是,要确保求和后的数值类型和原始结果一致,比如原始是DECIMAL(10,2),求和后也要保持相同精度,避免小数位数丢失。
内容的提问来源于stack exchange,提问作者user9399808
相关产品推荐
相关产品推荐

