【问题标题】:MySQL: Selecting each term as a column in a group by statementMySQL:选择每个术语作为分组语句中的一列
【发布时间】:2015-04-26 19:22:17
【问题描述】:

我在 MySQL 中有一个这样的表:

PersonID    id        X
1           1         0
1           2         1
1           3         1
1           4         1
2           1         1
2           2         0
2           3         0
2           4         1
3           1         1
3           2         0

等等。 X 是二进制的 - 1 或 0。假设它是随机的。

我想得到这样的查询结果:

PersonID   X1   X2   X3   X4
1          0    1    1    1
2          1    0    0    1
3          1    0    NULL NULL

我该怎么做?我尝试了以下方法:

select 
PersonID, 
case when id = 1 then X else NULL end as X1, 
case when id = 2 then X else NULL end as X2,
et cetera
from table 
group by PersonID

这显然是错误的,而且要花很长时间才能写出来(因为我每个人都有多达 700 个不同的 id),但这是我能想到的最好的了。

【问题讨论】:

  • 所以你可能有 700 个不同的 id 1,2,3...700 ?
  • 是的。以及 700 个不同的列。不幸的是,笨拙但必要
  • 在这种情况下,您将需要使用动态 sql 来生成数据透视表。检查 mysql 动态枢轴并确保您的列号不超过 4096
  • 数据展示问题在应用层/表现层代码解决

标签: mysql group-by


【解决方案1】:

您正在寻找聚合函数。对于四列:

select PersonID, 
       max(case when id = 1 then X else NULL end) as X1, 
       max(case when id = 2 then X else NULL end) as X2,
       max(case when id = 3 then X else NULL end) as X3,
       max(case when id = 4 then X else NULL end) as X4
from table 
group by PersonID;

您担心编写代码,只需将 id 列表放入电子表格中,使用公式生成适当的代码,然后将其复制回您的 SQL 查询中。

如果您有未知数量的 id,您可能需要使用动态 SQL。或者,您可以将这些值连接在一起:

select PersonID, 
       group_concat(x order by id) as xs
from table 
group by PersonID;

【讨论】:

  • 对于 700 个值,这一定很疯狂
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多