MySQL实现长表转宽表(按月份列转换)
MySQL实现长格式数据转宽格式方案
原始长格式数据(假设表名为monthly_data)
Month Type Amount Jan B1 951 Feb B1 1000 Mar B1 850 Jan B2 900 Feb B2 920 Mar B2 1000
目标宽格式数据
Type Jan Feb Mar B1 951 1000 850 B2 900 920 1000
实现SQL
MySQL没有原生的行转列(PIVOT)函数,我们可以通过聚合函数+条件判断来实现:
方法1:使用CASE语句
SELECT Type, SUM(CASE WHEN Month = 'Jan' THEN Amount ELSE 0 END) AS Jan, SUM(CASE WHEN Month = 'Feb' THEN Amount ELSE 0 END) AS Feb, SUM(CASE WHEN Month = 'Mar' THEN Amount ELSE 0 END) AS Mar FROM monthly_data GROUP BY Type ORDER BY Type;
方法2:使用IF函数(更简洁)
SELECT Type, SUM(IF(Month = 'Jan', Amount, 0)) AS Jan, SUM(IF(Month = 'Feb', Amount, 0)) AS Feb, SUM(IF(Month = 'Mar', Amount, 0)) AS Mar FROM monthly_data GROUP BY Type ORDER BY Type;
原理说明
- 用
CASE或IF筛选对应月份的Amount值,非目标月份的数值补0; - 通过
SUM聚合函数(如果每个Type+Month组合唯一,用MAX也可以)将同一Type下的各月份值聚合到一行; - 最后按
Type分组,得到宽格式的结果。
内容的提问来源于stack exchange,提问作者Harold Choi
相关产品推荐
相关产品推荐

