【问题标题】:How to create dynamic columns from the value rows in MySQL如何从 MySQL 中的值行创建动态列
【发布时间】:2017-10-26 18:31:54
【问题描述】:

这是我的桌子:

+----+-------+-----------+-------+
| id | Name  | Parameter | Value |
+----+-------+-----------+-------+
|  1 | Andy  | height    | 1.85  |
|  2 | Igal  | weight    | 56    |
|  3 | Yossi | age       | 28    |
|  4 | David | weight    |       |
|  5 | Igal  | height    | 1.9   |
|  6 | Andy  | age       | 25    |
+----+-------+-----------+-------+

这是我的查询:

SELECT
Name,
CASE WHEN (Paramter='age') THEN Value ELSE 0 END AS AGE,
CASE WHEN (Paramter='height') THEN Value ELSE 0 END AS HEIGHT,
CASE WHEN (Paramter='weight') THEN Value ELSE 0 END AS WEIGHT
FROM
table

结果:

+-------+-----+--------+--------+
| Name  | AGE | HEIGHT | WEIGTH |
+-------+-----+--------+--------+
| Andy  |   0 | 1.85   |      0 |
| Igal  |   0 | 0      |     56 |
| Yossi |  28 | 0      |      0 |
| David |   0 | 0      |        |
| Igal  |   0 | 1.9    |      0 |
| Andy  |  25 | 0      |      0 |
+-------+-----+--------+--------+

我也尝试按 [Name] 建立一个群组,但没有成功。

如何在一个行中显示每个人(姓名)的所有数据?

想要的餐桌:

+------+-----+--------+--------+ | Name | AGE | HEIGHT | WEIGTH | +------+-----+--------+--------+ | Igal | 0 | 1.9 | 56 | | Andy | 25 | 1.85 | 0 | +------+-----+--------+--------+

【问题讨论】:

  • 接受的答案和建议的重复项的其他高排名答案对于这个问题的要求来说太多了。
  • 此操作称为旋转,并且已在 SO 上多次询问和回答。链接的重复主题中最受好评的答案为您提供了有关如何在 MySQL 中设计此类查询的分步说明。但是,请注意,与 MySQL 相比,在应用程序逻辑中执行此转换可能更有效。
  • 你能做一个愿望结果的表格吗?
  • 我用目标表更新了问题。谢谢。
  • Use GROUP_CONCAT` 和 IF 条件来做到这一点,就像在这个例子中:SELECT Name, GROUP_CONCAT(IF(Parameter='age',Value,NULL) ) AS 年龄, GROUP_CONCAT(IF(Parameter='height',Value,NULL)) AS 身高, GROUP_CONCAT(IF(Parameter='weight',Value,NULL)) AS 体重 FROM @987654334 @ GROUP BY Name //输出:姓名 年龄 身高 体重 安迪 25 1.85 NULL David NULL NULL Igal NULL 1.9 56 Yossi 28 NULL NULL`

标签: mysql sql pivot


【解决方案1】:

你想要一些聚合:

SELECT Name,
       MAX(CASE WHEN Parameter = 'age' THEN Value END) AS AGE,
       MAX(CASE WHEN Parameter = 'height' THEN Value END) AS HEIGHT,
       MAX(CASE WHEN Parameter = 'weight' THEN Value END) AS WEIGHT
FROM table
GROUP BY Name;

我想指出缺少ELSE 0。如果不存在数据,我认为没有理由为这三列插入 0 值。

【讨论】:

  • SUM,具体取决于所需的行为,但总体上是聚合。
  • 删除重复的锤子然后提供与重复主题中描述的相同的代码逻辑并不是一个非常好的行为。您一遍又一遍地回答了这个问题,如果您不同意我提出的问题,您可以选择其中任何一个作为欺骗目标。
  • 非常感谢。它解决了。我错过了 Max 聚合
  • @Shadow 。 . .您更改了重复的答案。当前的问题与这个问题更相关(SQL Server 中的动态枢轴似乎与您最初分配的问题无关)。但是,您在我回答了这个问题之后才这样做。
  • 不,我没有更改欺骗答案,我链接的答案与动态旋转无关。
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 2016-05-10
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多