MySQL unpivot
时间: 2023-07-22 22:33:55 浏览: 111
MySQL没有原生的UNPIVOT函数,但可以使用UNION ALL或者UNION操作来模拟实现UNPIVOT操作。
假设有如下的数据表:
```
+----+-------+------+------+------+
| id | name | sub1 | sub2 | sub3 |
+----+-------+------+------+------+
| 1 | Alice | 90 | 80 | 70 |
| 2 | Bob | 60 | 50 | 40 |
+----+-------+------+------+------+
```
需要将每个学生的科目成绩转换为一行,可以使用如下的SQL语句:
```
SELECT id, name, subject, score
FROM (
SELECT id, name, sub1, sub2, sub3
FROM table_name
) t
UNION ALL
SELECT id, name, 'sub2', sub2
FROM table_name
UNION ALL
SELECT id, name, 'sub3', sub3
FROM table_name;
```
以上SQL语句使用UNION ALL操作将每个科目成绩转换为一行。最终的查询结果将包含四列,分别为学生ID、学生姓名、科目名称、成绩。需要注意的是,使用UNION ALL操作可能会产生重复的行,需要使用GROUP BY进行去重。
相关问题
mysql unpivot
MySQL并没有原生的UNPIVOT函数,但可以通过UNION ALL操作实现类似的功能。
假设有以下表格:
```sql
CREATE TABLE mytable (
id INT,
col1 INT,
col2 INT,
col3 INT
);
INSERT INTO mytable VALUES (1, 10, 20, 30);
INSERT INTO mytable VALUES (2, 40, 50, 60);
```
现在需要将列col1、col2、col3转换成行。
可以使用UNION ALL操作来实现:
```sql
SELECT id, 'col1' AS col_name, col1 AS col_value FROM mytable
UNION ALL
SELECT id, 'col2' AS col_name, col2 AS col_value FROM mytable
UNION ALL
SELECT id, 'col3' AS col_name, col3 AS col_value FROM mytable;
```
以上语句会返回以下结果:
```
+----+----------+-----------+
| id | col_name | col_value |
+----+----------+-----------+
| 1 | col1 | 10 |
| 1 | col2 | 20 |
| 1 | col3 | 30 |
| 2 | col1 | 40 |
| 2 | col2 | 50 |
| 2 | col3 | 60 |
+----+----------+-----------+
```
其中,UNION ALL操作会将三个SELECT语句的结果合并为一个结果集。在每个SELECT语句中,使用常量来表示列名,并将列值赋给另一个列。最终得到的结果集就是原始表格的列col1、col2、col3转换成行的结果。
mysql unpivot示例
在MySQL中,没有内置的UNPIVOT函数,但可以使用其他技术来实现相同的效果。下面是一个示例,展示了如何使用联结和条件语句来执行unpivot操作:
假设我们有以下表格:
```
+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
| 1 | 10 | 20 | 30 |
| 2 | 40 | 50 | 60 |
| 3 | 70 | 80 | 90 |
+----+------+------+------+
```
现在我们想要将这些列转换为行,可以使用以下查询来实现unpivot操作:
```
SELECT id, 'col1' AS column_name, col1 AS value
FROM your_table
UNION ALL
SELECT id, 'col2' AS column_name, col2 AS value
FROM your_table
UNION ALL
SELECT id, 'col3' AS column_name, col3 AS value
FROM your_table;
```
这将产生以下结果:
```
+----+-------------+-------+
| id | column_name | value |
+----+-------------+-------+
| 1 | col1 | 10 |
| 1 | col2 | 20 |
| 1 | col3 | 30 |
| 2 | col1 | 40 |
| 2 | col2 | 50 |
| 2 | col3 | 60 |
| 3 | col1 | 70 |
| 3 | col2 | 80 |
| 3 | col3 | 90 |
+----+-------------+-------+
```
通过使用UNION ALL将多个查询结果合并,可以将列转换为行,并将每个列的名称作为新的column_name列,将原始值作为value列。这样就实现了unpivot操作的效果。
阅读全文