@raswe

Как собирать данные по заказчику в одну запись?

Есть таблица с заказчиками и датами формирования и завершения заказа, вида
ID	NAME	BEGIN	        END
234	SOKOL	01.02.2020	08.02.2020
145	EVA	        03.02.2020	06.02.2020
145 	EVA	        16.02.2020	20.02.2020

Необходимо собрать единую сводную таблицу
ID	NAME	BEGIN1	         END1	          BEGIN2	         END2	      BEGIN3	     END3
234	SOKOL	01.02.2020	08.02.2020				
145	EVA	        03.02.2020	06.02.2020	16.02.2020	20.02.2020

Мы не знаем у какого заказчика какой месяц сколько будет заказов, у кого 1 в месяц, у кого и три. Нужно чтобы запрос сам собирал в одну строку по каждому заказчику данные.
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Отслеживать участки незаполненных периодов.

Интервалы и счетчики, с агрегатными и оконными функциями. Интервалы и счетчики, все части.

Выяснение сущности вопроса:
Либо собирать динамический запрос, либо использовать PIVOT.

Если строить динамический запрос, то сначала посчитайте сколько будет периодов-столбцов. Первые столбы - выбрать уникальные, столбцы-периоды из псевдонимов с соответствующими фильтрами.

Но если буквально:
Нужно чтобы запрос сам собирал в одну строку по каждому заказчику данные.

DECLARE @T TABLE ( ID INT, [Name] VARCHAR(50), [Begin] DATE, [End] DATE)
INSERT @T VALUES ( 234, 'SOKOL', '01.02.2020', '08.02.2020' ),
(145, 'EVA', '03.02.2020', '06.02.2020'),
(145, 'EVA', '16.02.2020', '20.02.2020')

SELECT ID, [Name], 
       STRING_AGG( CONVERT(VARCHAR, [Begin], 104) + '~' + 
                   CONVERT(VARCHAR, [End], 104), ', ') 
                      WITHIN GROUP (ORDER BY [Begin] ) AS [Orders]
  FROM @T 
  GROUP BY ID, [Name]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы