MySQL透视表查询中如何添加金额字段的求和列?
MySQL行转列查询新增金额汇总列的实现方法
先基于通用的行转列场景给出示例代码,你可以对应自己的表字段调整即可:
基础场景:新增每行的横向金额汇总列
假设你已经写出了如下基础行转列查询(以销售数据按月份统计为例,你可以替换成自己的业务字段):
SELECT category, SUM(IF(MONTH(sales_date) = 1, amount, 0)) AS `1月销售额`, SUM(IF(MONTH(sales_date) = 2, amount, 0)) AS `2月销售额`, SUM(IF(MONTH(sales_date) = 3, amount, 0)) AS `3月销售额` FROM sales GROUP BY category;
要新增每行所有金额的汇总列,直接在SELECT字段列表添加SUM(amount)即可,修改后代码如下:
SELECT category, SUM(IF(MONTH(sales_date) = 1, amount, 0)) AS `1月销售额`, SUM(IF(MONTH(sales_date) = 2, amount, 0)) AS `2月销售额`, SUM(IF(MONTH(sales_date) = 3, amount, 0)) AS `3月销售额`, -- 新增横向汇总列 SUM(amount) AS `季度总销售额` FROM sales GROUP BY category;
扩展场景:新增全表纵向汇总行
如果你需要在所有行的末尾加一行所有金额的总计,可使用WITH ROLLUP实现:
SELECT IFNULL(category, '总计') AS category, SUM(IF(MONTH(sales_date) = 1, amount, 0)) AS `1月销售额`, SUM(IF(MONTH(sales_date) = 2, amount, 0)) AS `2月销售额`, SUM(IF(MONTH(sales_date) = 3, amount, 0)) AS `3月销售额`, SUM(amount) AS `季度总销售额` FROM sales GROUP BY category WITH ROLLUP;
注意事项
- 直接使用
SUM(amount)的计算方式比手动拼接各个转列字段相加性能更好,结果完全一致 - 如果你的金额字段存在NULL值,可使用
SUM(IFNULL(amount, 0))处理,避免统计结果返回NULL WITH ROLLUP生成的汇总行,分组字段会返回NULL,使用IFNULL替换为自定义的总计标识即可提升可读性
内容的提问来源于stack exchange,提问作者integ specialist
相关产品推荐
相关产品推荐

