Sql Select Group By
Есть таблица "Tickets" c столбцами
SubAgentID в котором хранится ID Клиента
DEALDATE в котором хранится Дата операции
TotalSub в котором хранится сумма
и таблица "Counteragent" с столбцами
ID в котором хранится ID Клиента
ShortName в котором хранится Имя Клиента
Мой запрос
SELECT
t.DEALDATE as date, t.SubAgentID, c.ShortName as NameSub, ROUND(ISNULL(SUM(t.TotalSub),0),2) as TotalSub
FROM Tickets as t
left join Counteragent as c on c.ID=t.SubAgentID
WHERE t.DEALDATE Between '2023-02-01' AND '2023-02-02'
GROUP BY t.SubAgentID, t.DEALDATE, c.ShortName
ORDER BY t.DEALDATE, c.ShortName asc
Мой результат
Как мне сделать запрос чтобы результат был таким
Ответы (1 шт):
Автор решения: Arkee
→ Ссылка
СУБД SQL Server? Может, динамический PIVOT:
1. Выборка дат:
-- ограничиваем кол-во столбцов
DECLARE @dateLimiter [datetime] = (
SELECT MAX(t.[DEALDATE]) AS [latestDate]
FROM
[Tickets] t
);
SET @dateLimiter = DATEADD([day], -3, @dateLimiter);
-- генерируем столбцы с датой
DECLARE @dateCols [varchar](max) = STUFF(
(
SELECT DISTINCT
', [' + CONVERT([varchar](10), t.[DEALDATE], 120) + ']'
FROM [Tickets] t
WHERE
t.[DEALDATE] > @dateLimiter
ORDER BY 1
FOR XML PATH('date'), TYPE
).value('.', 'varchar(max)'),
1,
1,
''
);
2. Выполнение динамической SQL:
DECLARE @queryDynamic [varchar](max) = '
SELECT
[ShortName] AS [Клиент],
' + @dateCols + '
FROM
(
SELECT
t.[DEALDATE],
t.[TotalSub],
c.[ShortName]
FROM
[Tickets] t
INNER JOIN [Counteragent] c ON c.[ID] = t.[SubAgentID]
) t
PIVOT (
SUM(t.[TotalSub])
FOR [DEALDATE]
IN (' + @dateCols + ')
) p
';
EXECUTE(@queryDynamic);

