MySQL:将一列/多行group_concat分成多列,并填充另一列中的值

问题描述 投票:0回答:3

我已经看到了关于group_concat一列/多行成多列的许多答案,但是我找不到如何用第二列中的数据填充新列。

我的数据表看起来像这样:

first_name  doc_number  doc_status
a              1           new
a              2           new
b              3           pending
b              4           approved
c              5           new
c              6           approved
c              7           approved

这是我想要的结果:

first_name   doc_status_new   doc_status_pending   doc_status_approved
    a             1,2
    b                                3                      4
    c              5                                       6,7

这是我得到的结果:

    first_name   doc_status_new   doc_status_pending   doc_status_approved
    a             1,2
    b                                3,4                      
    c             5,6,7                                      

第2行在同一列中不应包含“ 3,4”。第3行也不应该在同一列中包含“ 5、6、7”。我不知道如何使group_concat仅列出仅与该“ where”语句相关的doc_number。

这是我使用的代码:

select 
first_name,
case when doc_status = 'new' then group_concat(doc_number) end as doc_status_new,
case when doc_status = 'pending' then group_concat(doc_number) end as doc_status_pending,
case when doc_status = 'approved' then group_concat(doc_number) end as doc_status_approved
from table_name
group by first_name;
mysql group-concat
3个回答
0
投票

您可能需要-

select first_name,
       group_concat(case when doc_status = 'new' then doc_number end) as doc_status_new,
       group_concat(case when doc_status = 'pending' then doc_number end) as doc_status_pending,
       group_concat(case when doc_status = 'approved' then doc_number end) as doc_status_approved
from table_name
group by first_name;

0
投票

我认为更好的解决方案是使用UNION,它非常快,并且使用LIKE:

(SELECT group_concat(doc_number) AS doc_status_new WHERE doc_status LIKE 'new')
UNION
(SELECT group_concat(doc_number) AS doc_status_pending WHERE doc_status LIKE 'pending')
UNION
(SELECT group_concat(doc_number) AS doc_status_approved WHERE doc_status LIKE 'approved')

我希望有帮助。


0
投票

您需要将doc_status列添加到SELECT和GROUP BY列表中:

select 
first_name,doc_status,
case when doc_status = 'new' then group_concat(doc_number) end as doc_status_new,
case when doc_status = 'pending' then group_concat(doc_number) end as doc_status_pending,
case when doc_status = 'approved' then group_concat(doc_number) end as doc_status_approved
from table_name
group by first_name,doc_status;
© www.soinside.com 2019 - 2024. All rights reserved.