如何在MySQL中完成数据表Unstack(行转列)操作
MySQL 行转列(Unstack)通用解决方案
静态实现(已知所有周期取值场景)
直接用CASE WHEN配合聚合函数实现,比多表关联写法性能更高、逻辑更简洁:
SELECT 产品, MAX(CASE WHEN 周期 = 'Jan-21' THEN 预测销量 END) AS `Jan-21`, MAX(CASE WHEN 周期 = 'Feb-21' THEN 预测销量 END) AS `Feb-21`, MAX(CASE WHEN 周期 = 'Mar-21' THEN 预测销量 END) AS `Mar-21` FROM 原始表名 GROUP BY 产品 ORDER BY 产品;
动态实现(周期动态新增/数量较多场景)
通过MySQL动态SQL自动识别所有周期生成查询语句,无需每次修改SQL结构,扩展性极强:
-- 动态拼接所有周期的查询逻辑 SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN 周期 = ''', 周期, ''' THEN 预测销量 END) AS `', 周期, '`' ) ) INTO @sql FROM 原始表名; -- 拼接完整查询语句 SET @sql = CONCAT('SELECT 产品, ', @sql, ' FROM 原始表名 GROUP BY 产品 ORDER BY 产品'); -- 执行动态语句 PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
其他工具实现参考
- Python Pandas:直接调用内置unstack方法即可完成转换
import pandas as pd # df为读取原始表得到的DataFrame对象 result_df = df.set_index(['产品', '周期'])['预测销量'].unstack().reset_index()
- Excel:插入数据透视表,行区域选「产品」、列区域选「周期」、值区域选「预测销量」即可得到目标结构
内容的提问来源于stack exchange,提问作者Stanley Hu
相关产品推荐
相关产品推荐

