> 文档中心 > 【MySQL查询常见面试题】MySQL行转列、列转行

【MySQL查询常见面试题】MySQL行转列、列转行


1. 列转行

表结构

mysql> desc row_to_column;+---------+--------------+------+-----+---------+-------+| Field   | Type  | Null | Key | Default | Extra |+---------+--------------+------+-----+---------+-------+| name    | varchar(255) | YES  |     | NULL    ||| score   | varchar(255) | YES  |     | NULL    ||| subject | varchar(255) | YES  |     | NULL    ||+---------+--------------+------+-----+---------+-------+

表数据

mysql> select * from row_to_column;+------+-------+---------+| name | score | subject |+------+-------+---------+| 小明 | 80    | 语文    || 小明 | 90    | 数学    || 小明 | 85    | 英语    || 小红 | 70    | 语文    || 小红 | 95    | 数学    || 小红 | 85    | 英语    |+------+-------+---------+

实现SQL

mysql> select name, max(if(subject = '语文', score, null)) as '语文' ,max(if(subject = '数学', score, null)) as '数学',max(if(subject = '英语', score, null)) as '英语' from row_to_column group by name;  +------+------+------+------+| name | 语文 | 数学 | 英语 |+------+------+------+------+| 小明 | 80   | 90   | 85   || 小红 | 70   | 95   | 85   |+------+------+------+------+

2. 行转列

表结构

mysql> desc column_to_row;+----------+--------------+------+-----+---------+-------+| Field    | Type  | Null | Key | Default | Extra |+----------+--------------+------+-----+---------+-------+| name     | varchar(255) | YES  |     | NULL    ||| subject1 | varchar(255) | YES  |     | NULL    ||| subject2 | varchar(255) | YES  |     | NULL    ||| subject3 | varchar(255) | YES  |     | NULL    ||+----------+--------------+------+-----+---------+-------+

表数据

mysql> select * from column_to_row;+------+----------+----------+----------+| name | subject1 | subject2 | subject3 |+------+----------+----------+----------+| 小明 | 80| 90| 100      || 小红 | 100      | 90| 80|+------+----------+----------+----------+

实现SQL

mysql> select name, 'subject1' as 'subject', subject1 as score from column_to_row    -> union all    -> select name, 'subject2' as 'subject', subject2 as score from column_to_row    -> union all    -> select name, 'subject3' as 'subject', subject3 as score from column_to_row    -> ;+------+----------+-------+| name | subject  | score |+------+----------+-------+| 小明 | subject1 | 80    || 小红 | subject1 | 100   || 小明 | subject2 | 90    || 小红 | subject2 | 90    || 小明 | subject3 | 100   || 小红 | subject3 | 80    |+------+----------+-------+