MySQL 5.7如何实现列转行(Unpivot)操作?
MySQL 5.7及以下行列转换解决方案
针对你给出的需求,这里提供适配MySQL 5.7及以下版本的实现方案,不需要用到CROSS JOIN:
1. 表结构与测试数据准备
假设你的表名为person_items,可通过以下语句创建并插入测试数据:
CREATE TABLE person_items ( NAME VARCHAR(20), CLOTH VARCHAR(3), SHOES VARCHAR(3), PHONE VARCHAR(3) ); INSERT INTO person_items VALUES ('MOHAN', 'YES', 'YES', 'YES'), ('MAHESH', 'YES', 'NO', 'NO');
2. 行列转换SQL实现
SELECT category, MAX(CASE WHEN NAME = 'MOHAN' THEN value END) AS MOHAN, MAX(CASE WHEN NAME = 'MAHESH' THEN value END) AS MAHESH FROM ( -- 用UNION ALL将原表列数据拆分为行数据 SELECT NAME, 'CLOTH' AS category, CLOTH AS value FROM person_items UNION ALL SELECT NAME, 'SHOES' AS category, SHOES AS value FROM person_items UNION ALL SELECT NAME, 'PHONE' AS category, PHONE AS value FROM person_items ) AS temp GROUP BY category ORDER BY category;
3. 代码逻辑说明
- 内层子查询:通过
UNION ALL把原表中每个用户的CLOTH、SHOES、PHONE字段拆分成独立行,每行包含用户名、类别名称和对应值,完成列到行的初步转换。 - 外层查询:以
category分组,用MAX(CASE...)聚合函数分别提取每个用户在对应类别下的取值(因每个类别+用户组合仅一条数据,用MIN也可达到效果)。 ORDER BY category保证结果按类别排序,与你期望的输出格式一致。
执行结果
运行上述SQL后,输出如下:
CATEGORY MOHAN MAHESH CLOTH YES YES SHOES YES NO PHONE YES NO
内容的提问来源于stack exchange,提问作者mohan111
相关产品推荐
相关产品推荐

