SQL пивот с месяцем и годом - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь отсортировать некоторые данные об отправке, используя SQL Pivot, но я не могу понять это. Я отсортировал данные таким образом (одна строка с общим количеством отправлений для семьи за каждый месяц каждого года, начиная с 2015 года):

ТАБЛИЦА A

Year | Month | ItemFamilyCode | TotalShipped
2018 |   9   |    FA01        |       5
2018 |   9   |    FA04        |       4
2018 |   10  |    FA01        |       2
2018 |   11  |    FA02        |       1
2018 |   12  |    FA03        |       3
2019 |   1   |    FA04        |       7

и скоро. Я хочу добиться следующего результата:

ItemFamilyCode | 2018-9 | 2018-10 | 2018-11 | 2018-12 | 2019-1 | [..]
FA01           |    5   |    2    |    0    |    0    |    0   |
FA02           |    0   |    0    |    1    |    0    |    0   |
FA03           |    0   |    0    |    0    |    3    |    0   |
FA04           |    4   |    0    |    1    |    0    |    7   |

и так далее ... семейный код по порядку и все значения для каждого месяца каждого года, от более старого месяца / года до настоящего времени. Является ли это возможным? Спасибо всем, кто может помочь.

1 Ответ

0 голосов
/ 13 января 2020

Если вы хотите использовать его как view:

SELECT * FROM   
(
    SELECT 
        Concat([Year],'-', [Month]) as [Date],
        ItemFamilyCode,
        TotalShipped
    FROM Shipping -- Or any Table Name
) t 
PIVOT(
    Sum(TotalShipped) 
    FOR [Date] IN (
        [2018-9], 
        [2018-10], 
        [2018-11], 
        [2018-12], 
        [2019-1], 
        [2019-2] -- You have to type all months until today
        )
) AS pivot_table;

И, dynamic sql, если вы можете использовать его в stored procedure:

Составьте таблицу с содержанием списка дат для создания строки списка дат

DECLARE 
    @columns NVARCHAR(MAX) = '', 
    @sql     NVARCHAR(MAX) = '';

-- select the category names
SELECT 
    @columns+=QUOTENAME(Date) + ','
FROM 
    DateList
ORDER BY 
    DateList;

-- remove the last comma
SET @columns = LEFT(@columns, LEN(@columns) - 1);

-- construct dynamic SQL
SET @sql ='
SELECT * FROM   
(
    SELECT 
        Concat([Year],'-', [Month]) as [Date],
        ItemFamilyCode,
        TotalShipped 
    FROM Shipping -- Or any Table Name
) t 
PIVOT(
    Sum(TotalShipped)  
    FOR [Date] IN ('+ @columns +')
) AS pivot_table;';

-- execute the dynamic SQL
EXECUTE sp_executesql @sql;

Источник: sqlservertutorial

...