【问题标题】:SQL Server pivot query - questionsSQL Server 数据透视查询 - 问题
【发布时间】:2020-11-21 23:52:25
【问题描述】:

我有一个包含 3 列的表格:order_id, product_id, product_count

第一列是客户传递的订单,第二列是产品唯一ID,第三列是订单中购买的产品数量。

我想创建一个包含购买物品数量的order_id / product_id 矩阵。

因此,我想要一些看起来像这样的东西:

如果我提出这个要求:

SELECT * 
FROM 
    (SELECT
         [order_id], [prod_id], [product_count]
     FROM mydb.dbo.mytable) QueryResults
PIVOT 
    (SUM([product_count])
         FOR [prod_id] IN ([21], [22], [23])
    ) AS PivotTable

我的问题是我要检索 200 多种不同的产品。有没有办法在不输入所有值的情况下做到这一点?

【问题讨论】:

标签: sql sql-server pivot dynamic-pivot


【解决方案1】:

当 BICube 发布他的评论时,我已经写了这个并且正在测试 - 是的,这是另一个动态 Pivot。你有基本的代码 - 你需要做的就是

  • 使用列名列表构建变量,例如ColList = '[21],[22],[23]'
  • 在 PIVOT 中使用此变量来提供列列表 - 但请注意,您需要将整个语句变成动态 SQL。

这是我写的答案(请注意,我只是编造订单数据,而不是从您的图像中转录)。

CREATE TABLE #MyTable (Order_ID int, Prod_ID int, Product_Count int);
INSERT INTO #MyTable (Order_ID, Prod_ID, Product_Count)
VALUES
(100, 1, 15),
(100, 2, 12),
(100, 5, 17),
(101, 3, 10),
(101, 4, 11),
(102, 6, 12),
(102, 1, 16);

SELECT * FROM #MyTable;

DECLARE @ColList nvarchar(max) = N''
SELECT @ColList += N',' + QUOTENAME(LTRIM(STR(Prod_ID)))
    FROM (SELECT DISTINCT Prod_ID FROM #MyTable) A;

SET @ColList = STUFF(@ColList,1,1,''); -- Remove leading comma

DECLARE @PivotSQL nvarchar(max);
SET @PivotSQL = 
N'SELECT * FROM (
  SELECT
    [Order_ID],
    [prod_id],
    [product_count]
  FROM #MyTable
) QueryResults
PIVOT (
  SUM([product_count])
  FOR [prod_id]
  IN (' + @ColList + N')
) AS PivotTable;'

EXEC (@PivotSQL);

这是结果

Order_ID    1       2       3       4       5       6
100         15      12      NULL    NULL    17      NULL
101         NULL    NULL    10      11      NULL    NULL
102         16      NULL    NULL    NULL    NULL    12

【讨论】:

    【解决方案2】:

    基于拯救了我的@seanb 答案,我尝试将 NULL 值替换为 0。我理解了原理(基础)。这是我更新 SQL 请求以替换 NULL 值的方法。

    DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
            @PivotColumnNames AS NVARCHAR(MAX),
            @PivotSelectColumnNames AS NVARCHAR(MAX)
    
    
    --Get distinct values of the PIVOT Column
    SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','') + QUOTENAME(prod_id)
    FROM (SELECT DISTINCT prod_id FROM #MyTable) AS prod_id
    
    
    --Get distinct values of the PIVOT Column with isnull
    SELECT @PivotSelectColumnNames 
        = ISNULL(@PivotSelectColumnNames + ',','')
        + 'ISNULL(' + QUOTENAME(prod_id) + ', 0) AS '
        + QUOTENAME(prod_id)
    FROM (SELECT DISTINCT prod_id FROM #MyTable) AS prod_id
    
    
    --Prepare the PIVOT query using the dynamic
    SET @DynamicPivotQuery =
    N'SELECT order_id, ' + @PivotSelectColumnNames + '
    FROM #MyTable
    PIVOT(SUM(product_count)
    FOR prod_id IN (' + @PivotColumnNames + ')) AS PivotTable'
    --Execute the Dynamic Pivot Query
    EXEC sp_executesql @DynamicPivotQuery
    

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 2013-06-06
      • 2010-11-27
      • 2015-06-08
      • 2011-10-16
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多