mysql怎么转换行和列
时间 : 2023-03-09 12:17:01声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在MySQL中,可以使用`PIVOT`和`UNPIVOT`函数来完成行列转换。

1. 行转列

行转列操作可以通过`PIVOT`函数来完成。假设有以下的表格:

+----+------+---------+

| ID | Name | Value |

+----+------+---------+

| 1 | A | 100 |

| 1 | B | 200 |

| 2 | C | 300 |

| 2 | D | 400 |

+----+------+---------+

现在希望将这个表格中的Name列转换为列,以ID为基准,每个ID对应一行,而每个Name对应的值则填充到对应的列中。转换后的表格如下:

+----+------+------+------+

| ID | A | B | C |

+----+------+------+------+

| 1 | 100 | 200 | NULL |

| 2 | NULL | NULL | 300 |

+----+------+------+------+

可以使用以下代码实现:

SELECT ID,

MAX(CASE Name WHEN 'A' THEN Value ELSE NULL END) AS 'A',

MAX(CASE Name WHEN 'B' THEN Value ELSE NULL END) AS 'B',

MAX(CASE Name WHEN 'C' THEN Value ELSE NULL END) AS 'C'

FROM tablename

GROUP BY ID;

上述代码中,`CASE`语句将Name列中的值转换为对应的列名,而`MAX`函数将不同行中相同列的值进行合并。

2. 列转行

列转行操作可以通过`UNPIVOT`函数来完成。假设有以下的表格:

+----+------+------+------+

| ID | A | B | C |

+----+------+------+------+

| 1 | 100 | 200 | NULL |

| 2 | NULL | NULL | 300 |

+----+------+------+------+

现在希望将该表格中的A、B、C列转换为行,保留ID列。转换后的表格如下:

+----+------+-------+

| ID | Name | Value |

+----+------+-------+

| 1 | A | 100 |

| 1 | B | 200 |

| 1 | C | NULL |

| 2 | A | NULL |

| 2 | B | NULL |

| 2 | C | 300 |

+----+------+-------+

可以使用以下代码实现:

SELECT ID, Name, Value

FROM (

SELECT ID,

'A' AS Name,

A AS Value

FROM tablename

UNION ALL

SELECT ID,

'B' AS Name,

B AS Value

FROM tablename

UNION ALL

SELECT ID,

'C' AS Name,

C AS Value

FROM tablename

) AS T

WHERE Value IS NOT NULL;

上述代码中,`UNION ALL`操作将不同列转换为相同列,`WHERE`语句则去除值为NULL的行。

总结

通过`PIVOT`和`UNPIVOT`函数,可以简单地完成MySQL中的列转行和行转列操作。需要注意的是,这两个函数在MySQL中是不存在的,需要通过其他方法实现。