MySQL: один столбец / несколько строк group_concat в несколько столбцов, заполненных значениями из другого столбца - PullRequest
1 голос
/ 20 января 2020

Я видел много ответов для 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 перечислить только номер 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;

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вам, вероятно, нужно -

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 голосов
/ 20 января 2020

Я думаю, что лучшим решением будет использование 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')

Надеюсь, это поможет.

...