首页 > 解决方案 > MySQL - 将行作为列和列作为行?

问题描述

如何将一行转换为 MySQL 中的一列?

我已经在 StackOverflow 上阅读了有关此主题的一些问题,但我仍然不知道如何才能达到我想要的结果。我也尝试了一些代码但没有成功。

以下示例有望使我想要的结果清楚。我创建了一个按用户 ID 分组的名为“summary_kcal”的视图。它的组成如下:

+---------+------+------+------+------+------+------+------+
| userid  |  LU  |  MA  |  ME  |  GIO |  VE  |  SA  | DO   | 
+---------+------+------+------+------+------+------+------+
| 1       | 1000 | 2000 | 1000 | 1500 | 2000 | 1000 | 1500 |
+---------+------+------+------+------+------+------+------+

我想将其转换为:

+---------+---------+
| userid  | 1       |
+---------+---------+
| LU      | 1000    | 
+---------+---------+
| MA      | 2000    | 
+---------+---------+
| ME      | 1000    |
+---------+---------+
| GIO     | 1500    |
+---------+---------+
| VE      | 2000    |
+---------+---------+
| SA      | 1000    |
+---------+---------+
| DO      | 1500    |
+---------+---------+

标签: mysql

解决方案


你通常最好在客户端做这种转换,但如果你真的需要在数据库中做......

SELECT "LU" AS userid, `LU` AS `1` WHERE userid = 1
UNION
SELECT "MA" AS userid, `MA` AS `1` WHERE userid = 1
UNION
SELECT "ME" AS userid, `ME` AS `1` WHERE userid = 1
UNION
SELECT "GIO" AS userid, `GIO` AS `1` WHERE userid = 1
UNION
SELECT "VE" AS userid, `VE` AS `1` WHERE userid = 1
UNION
SELECT "SA" AS userid, `SA` AS `1` WHERE userid = 1
UNION
SELECT "DO" AS userid, `DO` AS `1` WHERE userid = 1

注意:您实际上只需要第一个查询中的别名,只是为了清晰和一致而包括在内。

如果您想要多个列,一个用于每个用户行,这将很快变得难以管理,因为每个XX AS # WHERE userid = #最终都需要成为一个单独的子查询(或带有条件聚合的大型笨拙的 GROUP CONCAT 查询)


推荐阅读