我的SQL PIVOT查询无法按预期工作

时间:2019-07-10 10:39:10

标签: sql sql-server pivot sql-server-2016

我正在使用以下SQL查询返回具有4列YearMonthQuantity SoldStock_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_Code和大约40 x yr / mon组合。

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都有一行,每个Year / Month组合都有一列。

我以前从未使用过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为显示2015年4月售出的股票代码的数量。

真的很想了解我上面的代码有什么问题。

2 个答案:

答案 0 :(得分:0)

您无需使用枢轴即可实现这一目标。

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`;

答案 1 :(得分:0)

以下使用动态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