【问题标题】:My Sql PIVOT Query Is Not Working As Intended我的 Sql PIVOT 查询未按预期工作
【发布时间】:2019-07-10 10:39:10
【问题描述】:

我正在使用以下 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_Codes 和大约 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 有一行,每个年/月组合都有列。

我以前从未使用过 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 销售的股票代码的数量。

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

【问题讨论】:

  • 请提供符合预期结果的样本数据

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


【解决方案1】:

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

【讨论】:

  • 感谢您的帮助。如果我没看错,那么第一个 INSERT INTO 需要列出 Year、Month 和 Stock_Code 的所有组合?我有大约 3000 个 Stock_Codes 和 50 种年/月组合。
  • Insert Into... 用于创建演示表,您需要在查询中使用CONVERT(VARCHAR(10),Mnt) +'' ''+ CONVERT(VARCHAR(10),Yr) 创建所有年/月组合
【解决方案2】:

您可以在不使用旋转的情况下实现此目的。

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

【讨论】:

  • 感谢您的帮助。 P.'company_name' 在做什么?为什么是 P?
  • P.company_name 已更正为 p.STOCK_CODE。 P 用作表别名。对于这个例子,表别名没有多大意义。只是一个 sql 习惯。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2023-03-24
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多