Подскажите пожалуйста, как в 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