如果有人问我,请原谅我,因为我甚至不知道该搜索什么。
我有两个表,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
这可能吗?
谢谢, 杰夫
答案 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