MySQL经典行列转换
CREATE TABLE IF NOT EXISTS column_row_change(
name varchar(10),
subject varchar(10),
score varchar(10)
);
INSERT INTO column_row_change VALUES \
('小明','语文',96),
('小明','数学',98),
('小明','英语',95),
('大花','语文',82),
('大花','数学',86),
('大花','英语',88);
SELECT * FROM column_row_change;
+
| name | subject | score |
+
| 小明 | 语文 | 96 |
| 小明 | 数学 | 98 |
| 小明 | 英语 | 95 |
| 大花 | 语文 | 82 |
| 大花 | 数学 | 86 |
| 大花 | 英语 | 88 |
+
SELECT
name AS name,
SUM(IF(subject = '语文',score,null)) AS 语文,
SUM(IF(subject = '数学',score,null)) AS 数学,
SUM(IF(subject = '英语',score,null)) AS 英语
FROM column_row_change
GROUP BY name ;
+
| name | 语文 | 数学 | 英语 |
+
| 小明 | 96 | 98 | 95 |
| 大花 | 82 | 86 | 88 |
+
CREATE TABLE row_column_change AS
SELECT
name AS name,
SUM(IF(subject = '语文',score,null)) AS 语文,
SUM(IF(subject = '数学',score,null)) AS 数学,
SUM(IF(subject = '英语',score,null)) AS 英语
FROM column_row_change
GROUP BY name ;
SELECT * FROM row_column_change;
+
| name | 语文 | 数学 | 英语 |
+
| 小明 | 96 | 98 | 95 |
| 大花 | 82 | 86 | 88 |
+
SELECT name, '语文' AS subject ,语文 FROM row_column_change
UNION ALL
SELECT name, '数学' AS subject ,数学 FROM row_column_change
UNION ALL
SELECT name, '英语' AS subject ,英语 FROM row_column_change
ORDER BY name DESC;
+
| name | subject | score |
+
| 小明 | 语文 | 96 |
| 小明 | 数学 | 98 |
| 小明 | 英语 | 95 |
| 大花 | 语文 | 82 |
| 大花 | 数学 | 86 |
| 大花 | 英语 | 88 |
+