Sql Select Group By

Рейтинг: 1Ответов: 1Опубликовано: 03.05.2023

Есть таблица "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

Мой результат

введите сюда описание изображения

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

введите сюда описание изображения

Ответы

▲ 2Принят

СУБД 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);