Как динамически сводить данные за каждый месяц? - PullRequest
2 голосов
/ 27 июня 2019

Я проверяю количество заказов магазинов с франшизой или с самостоятельным управлением для компании.Они помещены в категорию разницы дат.Вот запрос и результат в качестве объяснения:

SELECT [Order-Delivery Difference], [Type], COUNT(DISTINCT OrderId) AS [Number of Orders]
FROM (SELECT DDIFF AS [Order-Delivery Difference], Franchise AS [Type], OrderId, [Net Value]
        FROM joined
        GROUP BY DDIFF, FRANCHISE, OrderId, [Net Value]
      ) AS subquery
GROUP BY [Order-Delivery Difference], [Type]
HAVING SUM([Net Value]) > 0
ORDER BY [Order-Delivery Difference]
;

enter image description here

У меня есть столбец типа Date в моей таблице, назовем его DateColumn.Я могу теоретически отфильтровать этот результат по любому конкретному времени.

...
(SELECT DDIFF AS [Order-Delivery Difference], Franchise AS [Type], OrderId, [Net value]
    FROM joined
    WHERE DATEPART(year, [DateColumn]) = 2017 AND DATEPART(month, [DateColumn]) = 1
    GROUP BY DDIFF, FRANCHISE, OrderId, [Net Value]
) AS subquery
...

Но я хочу повернуть этот результат для каждой отдельной даты месяца, доступной в столбце «Дата», например:

enter image description here

Мои вопросы: могу ли я создать такую ​​сводную таблицу, имея еще один столбец в начале?Или я должен создать сводную таблицу для каждой отдельной категории разницы OD?Есть ли практический способ сделать это?

Также существует процедурное решение для создания столбца со всеми отчетливыми датами месяца, чтобы дать его в качестве динамического атрибута, установленного для сводной функции?

1 Ответ

2 голосов
/ 27 июня 2019

Возможно, это поможет

Пример

Declare @SQL varchar(max) = '
Select *
From (
        Select [Order-Delivery Difference] = DDIFF
             , [Type]  = Franchise 
             , [Value] = COUNT(DISTINCT OrderId)
             , [Item]  = left(DateColumn,7)
        From JOINED
        Group By DDIFF,Franchise,left(DateColumn,7)
     ) A
 Pivot (sum(Value) For [Item] in (' + Stuff((Select Distinct ',' + QuoteName(left(DateColumn,7)) From  JOINED Order By 1 For XML Path('')),1,1,'')  + ') ) p
 Order By [Order-Delivery Difference]
         ,Type
'

--Print @SQL
Exec(@SQL);

Пример данных выглядит следующим образом

enter image description here

Результаты выглядят следующим образом

enter image description here

РЕДАКТИРОВАНИЕ - ИСПРАВЛЕНО ДЛЯ КОЛОННЫ ИЗ ФРАНЦУЗСКИ

Для порции штучки

Select Distinct ',' + QuoteName(left(DateColumn,7)) From  #JOINED

Создает

(No column name)
,[2017-01]
,[2017-02]

Когда мы добавляемДля XML мы получаем строку XML

,[2017-01],[2017-02]

Затем STUFF(...,1,1,'') удаляет начальную запятую, которая становится столбцами PIVOT

[2017-01],[2017-02]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...