查询动态列和每列的计数

时间:2015-05-05 16:36:24

标签: sql sql-server tsql

如果有人问我,请原谅我,因为我甚至不知道该搜索什么。

我有两个表,SKU和OrderSKU,如下所示:

SKU_Code      Description
-----------------------------
1001          Product1
1002          Product2
1003          Product3
1004          Product5

OrderID       SKU     Quantity
-----------------------------
13            1001    34
13            1002    15
13            1004    2
15            1003    7
15            1004    8

我想要一个选择SKU表中所有行的查询,然后给我一个OrderSku表中每个sku的计数(即使为零),按订单ID分组。理想情况下,结果集看起来像这样:

OrderID   1001  1002   1003   1004
-------------------------------------
13        34    15     0      2
15        0     0      7      8

这可能吗?

谢谢, 杰夫

2 个答案:

答案 0 :(得分:3)

您正在寻找的是动态SQL,因为SQL Server不允许直接将值列表输入到pivot函数中。试试这个:

DECLARE @SelectCols VARCHAR(MAX),
        @PivotCols  VARCHAR(MAX);

SELECT  @SelectCols = COALESCE(@SelectCols + ',','') + 'ISNULL(' + QUOTENAME(Sku) + ',0) AS ' + QUOTENAME(sku),
        @PivotCols  = COALESCE(@PivotCols + ',','') + QUOTENAME(Sku)
FROM OrderSku
GROUP BY Sku

SELECT @SelectCols,@PivotCols

EXEC
(
    'SELECT DISTINCT OrderID,' + @SelectCols +
    ' FROM OrderSku 
    INNER JOIN [Order] SO
    ON      orderid = SO.salesorderid
        AND SO.orderstatusid IN (1,2,3)
    PIVOT
    (
        MAX(Quantity) FOR SKU IN (' + @PivotCols + ')
    ) pvt'
)

答案 1 :(得分:1)

只有你事先知道你想要什么样的SKU,或者你是否愿意使用动态sql,才能实现你想要的。如果您有一个很多的SKU,那么在数据库服务器级别执行此操作可能不太可行,并且您希望在客户端代码中执行PIVOT。

如果你选择在客户端上进行透视,那么你需要这样的东西:

With SkuOrderCross As 
(
   SELECT DISTINCT SKU.SKU_Code, OrderID
   FROM OrderSku
   INNER JOIN SalesOrder so ON so.SalesOrderID = OrderSku.OrderID
   CROSS JOIN SKU
enter code here
   WHERE so.OrderStatusID in (1,2,3)
)
SELECT c.OrderID, c.Sku_Code, coalesce(o.Quantity, 0) Quantity
FROM SkuOrderCross c
LEFT JOIN OrderSku o ON o.OrderID = c.OrderID AND o.SKU = c.Sku_Code
ORDER BY c.OrderID, c.Sku_Code

该查询将提供您想要用于数据透视的原始数据。

如果这仅适用于一次性或不常见的报告,则以下SuperUser问题演示了如何将从此查询中检索到的数据转换为所需格式后将其加载到Excel中:

  

https://superuser.com/questions/569185/convert-a-table-of-3-columns-of-x-y-value-to-the-matrix-table