MySQL:将每个术语选择为 group by 语句中的一列

标签 mysql group-by

我在 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 给每个人),但这是我能想到的最好的。

最佳答案

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

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;

关于MySQL:将每个术语选择为 group by 语句中的一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29882369/

相关文章:

mysql - Birt 报告在列中显示 ascii 值

mysql - 不是单组组函数oracle sum 与子查询sum

python - 聚合具有列表的列作为 pandas 数据框中的值

MYSQL 联合组依据

python - 创建数据框分组的切片

mysql - 按分组列分组?

php - mysqli_connect()的第四个参数是什么?

mysql - 枢。使用行作为列名并填充记录

javascript - ckeditor 实体 html 数据库

PHP/MySQL 自动更新客户端