Подскажите пожалуйста, как в mysql из одного столбца вывести данные в несколько столбцов?

Есть таблица в которой весь процесс обращений записан по времени:

appeal_id    client_id        dt                       text
1              111       2022-03-14 15:11:45         Обращение
2              111       2022-03-14 15:12:51         Отказ
3              111       2022-03-31 13:30:54         Отказ
4              111       2022-03-14 15:18:36         Нет документов

Каждое обращение и результат записан в один столбец. Мне необходимо данные представить в разные столбцы и по времени:

client_id  Обращение         Отказ             Одобрено          Проведено      
111        14.03.2022 15:11  14.03.2022 15:12  (null)            (null)     
111        14.03.2022 15:16  14.03.2022 15:17  (null)            (null)            
111        31.03.2022 13:30  31.03.2022 13:30  (null)            (null)     
111        31.03.2022 13:32  (null)            31.03.2022 13:33  01.04.2022 0:00  

Код на создание таблицы с данными:

CREATE TABLE appeal(
    appeal_id INT PRIMARY KEY AUTO_INCREMENT, 
    client_id INT,
    dt datetime,
    text VARCHAR (30)
);

INSERT INTO appeal (client_id, dt, text) VALUES 
('111', '2022-03-14 15:11:45.000', 'Обращение'),
('111', '2022-03-14 15:12:51.000',  'Отказ'),
('111', '2022-03-31 13:30:54.000',  'Отказ'),
('111', '2022-03-14 15:18:36.000',  'Нет документов'),
('111', '2022-03-31 13:30:05.000',  'Обращение'),
('111', '2022-03-31 13:34:28.000',  'Есть документы'),
('111', '2022-04-01 00:00:00.000',  'Проведено'), 
('111', '2022-03-14 15:16:22.000',  'Обращение'),
('111', '2022-03-14 15:17:36.000',  'Отказ'),
('111', '2022-03-31 13:32:47.000',  'Обращение'),
('111', '2022-03-31 13:33:47.000',  'Одобрено'); 

то, что я пытался сделать:

select distinct client_id,
case when text like '%обращение%' then dt end 'Обращение',
case when text like '%Отказ%' then dt end 'Отказ',
case when text like '%Одобрено%' then dt end 'Одобрено',
case when text like '%Проведено%'  then dt end 'Проведено',
case when text like '%Нет документов%' then dt end 'Нет документов',
case when text like '%Есть документы%' then dt end 'Есть документы'
from appeal

Подскажите в чем ошибка и как можно представить конечный результат в желаемый вид?


Ответы (1 шт):

Автор решения: Akina

Вариант для заявленного Microsoft SQL Server 2017:

WITH cte AS (
    SELECT *, SUM(CASE WHEN [text] = N'Обращение' THEN 1 ELSE 0 END) OVER (PARTITION BY client_id ORDER BY dt) grp
    FROM appeal
)
SELECT client_id,
       MAX(CASE WHEN [text] = N'Обращение' THEN dt END) [Обращение],
       MAX(CASE WHEN [text] = N'Отказ' THEN dt END) [Отказ],
       MAX(CASE WHEN [text] = N'Одобрено' THEN dt END) [Одобрено],
       MAX(CASE WHEN [text] = N'Проведено' THEN dt END) [Проведено],
       MAX(CASE WHEN [text] = N'Нет документов' THEN dt END) [Нет документов],
       MAX(CASE WHEN [text] = N'Есть документы' THEN dt END) [Есть документы]
FROM cte 
GROUP BY client_id, grp
ORDER BY client_id, grp

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=72e6a069ad64d1780d0c726dbdb145a3

→ Ссылка