如何在SELECT查询中为特定列添加底部求和结果?已尝试UNION遇列数问题
解决SELECT *加底部特定列求和的问题
直接用UNION确实会因为列数不匹配报错,你可以用UNION ALL配合空值/自定义文本填充非求和列的方式来实现,同时通过排序把求和行固定在底部。
举个实际例子,假设你的表名为order_details,包含order_id、goods_name、price、num这几列,你要对price和num列求和,其他列显示“合计”或空值:
-- 查询原始数据 SELECT order_id, goods_name, price, num FROM order_details UNION ALL -- 求和行,非求和列用NULL或自定义文本填充,保证列数一致 SELECT NULL, '合计', SUM(price), SUM(num) FROM order_details -- 排序让求和行在最后 ORDER BY CASE WHEN order_id IS NULL THEN 1 ELSE 0 END;
关键要点:
- 用
UNION ALL而非UNION:因为不需要去重,性能更好,而且原始数据和求和行本身就是不同的记录 - 填充非求和列:对于不需要显示求和的列,用
NULL或者像'合计'这样的标识文本填充,必须保证和上半部分查询的列数、对应列的数据类型完全匹配,否则还是会报错 - 强制排序:通过
CASE表达式让求和行(这里用order_id IS NULL判断)排在最后,避免因为数据顺序导致求和行位置不对
如果你的表列很多(用了SELECT *),可以先查询表的列结构,把非求和列逐一处理,比如:
SELECT * FROM your_table UNION ALL SELECT NULL, -- 第1列非求和,填NULL NULL, -- 第2列非求和,填NULL SUM(target_col1), -- 要求和的列1 NULL, -- 第4列非求和,填NULL SUM(target_col2) -- 要求和的列2 -- 剩下的列依次用NULL填充,直到列数和SELECT *一致 FROM your_table ORDER BY CASE WHEN 主键列 IS NULL THEN 1 ELSE 0 END;
注意:如果主键列可能有NULL值,换一个不会为NULL的列来判断求和行,比如用某个必填列是否为NULL来区分。
内容的提问来源于stack exchange,提问作者Stipane
相关产品推荐
相关产品推荐

