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);
→ Ссылка