Мой запрос Sql PIVOT не работает по назначению - PullRequest
0 голосов
/ 10 июля 2019

Я использую следующий запрос SQL, чтобы вернуть таблицу с 4 столбцами Year, Month, Quantity Sold, Stock_Code,

SELECT yr,  mon, sum(Quantity) as Quantity, STOCK_CODE
FROM [All Stock Purchased]
group by yr, mon, stock_code
order by yr, mon, stock_code

Это пример некоторых изНО у меня есть около 3000 Stock_Codes и около 40 x год / месяц комбинаций.

yr    mon  Quantity  STOCK_CODE
2015  4    42        100105
2015  4    220       100135
2015  4    1         100237
2015  4    2         100252
2015  4    1         100277

Я хочу объединить это в таблицу, в которой есть строка для каждого SKU и столбцы для каждой комбинации года / месяца.

Я никогда раньше не использовал Pivot, поэтому провел некоторое исследование и создал SQL-запрос, который, по моему мнению, должен работать.

select * from
(SELECT yr, 
mon, Quantity,
STOCK_CODE
FROM           [All Stock Purchased]) AS BaseData
pivot (
sum(Quantity)
For Stock_Code
in ([4 2015],[5 2015] ...........
) as PivotTable

Этот запрос возвращает таблицу с Yr в качестве col1, Mon в качествеcol2, а затем 4 2015 и т. д. в качестве последующих столбцов.Принимая во внимание, что я хочу, чтобы col1 был Stock_Code, а col2 - количество этого биржевого кода, проданного в 4 2015 году.

Очень хотелось бы понять, что не так с моим кодом выше, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Следующий запрос с использованием динамического PIVOT должен делать то, что вы хотите:

CREATE TABLE #temp (Yr INT,Mnt INT,Quantity INT, Stock_Code INT)
INSERT INTO #temp VALUES
(2015,4,42,100105),
(2015,4,100,100105),
(2015,5,220,100135),
(2015,4,1,100237),
(2015,4,2,100252),
(2015,7,1,100277)

DECLARE @pvt NVARCHAR(MAX) = '';

SET @pvt = STUFF(
  (SELECT DISTINCT N', ' + QUOTENAME(CONVERT(VARCHAR(10),Mnt) +' '+ CONVERT(VARCHAR(10),Yr)) FROM #temp FOR XML PATH('')),1,2,N'');

EXEC (N'
SELECT pvt.* FROM (
    SELECT Stock_Code
        ,CONVERT(VARCHAR(10),Mnt) +'' ''+ CONVERT(VARCHAR(10),Yr) AS [Tag]
        ,Quantity
    FROM #temp )a
    PIVOT (SUM(Quantity) FOR [Tag] IN ('+@pvt+')) pvt');

Результат, как показано ниже,

Stock_Code  4 2015  5 2015  7 2015
100105      142     NULL    NULL
100135      NULL    220     NULL
100237      1       NULL    NULL
100252      2       NULL    NULL
100277      NULL    NULL    1
0 голосов
/ 10 июля 2019

Этого можно добиться, не используя поворот.

SELECT  P.`STOCK_CODE`,
    SUM(
        CASE 
            WHEN P.`yr`=2015 AND P.`mon` = '1' 
            THEN P.`Quantity` 
            ELSE 0
        END
    ) AS '1 2015',
    SUM(
        CASE 
            WHEN P.`yr`=2015 AND P.`mon` = '2' 
            THEN P.`Quantity` 
            ELSE 0
        END
    ) AS '2 2015',
    SUM(
        CASE 
            WHEN P.`yr`=2015 AND P.`mon` = '3' 
            THEN P.`Quantity` 
            ELSE 0
        END
    ) AS '3 2015',
FROM    [All Stock Purchased] P
GROUP BY P.`STOCK_CODE`;
...