在此示例中,我有两个表格,其中包含我的客户和办公用品商店的产品数据。如下所示:
上表主要用于为第三个表提供所需数据,即Orders表
使用订单表,我可以从客户和产品表中快速总结我需要的报告。当我想查看每个项目的每个客户的购买数时,问题就开始了。
例如,像这些表一样。
使用上面的表格,我需要创建一个报告,显示每个项目的每个客户的购买数量。
喜欢这个。
我使用CTE
按Row_number
显示项目,但我现在的代码太长了,我目前正在测试某种方式,以最有效和最简洁的方式执行此操作。如果有人可以教会我如何做到这一点,那就更好了。
我不太确定我的问题的标题是否正确,如果看起来不对,我会改变它。
答案 0 :(得分:3)
所以第一步是从你的基本查询开始。这将为您提供最终报告信息,但格式错误。现在所需要的只是转动它。
Select cus_Name, prod_Name, SUM(ord_Qty)
from Orders o
inner join Customers c on c.cus_ID = o.cus_ID
inner join Products p on p.prod_ID = o.Prod_ID
GROUP BY cus_Name, prod_Name
<强>已更新强>
透视这个更有趣,因为可能是产品数量不固定。因此,您需要编写动态数据透视表以根据产品确定列!请注意我还没有测试过以下内容,但你应该明白这个想法。有关Pivots的更多问题,请参阅dynamic pivots上的大量帖子:
请参阅SQLFiddle
DECLARE @colsForSelect VARCHAR(2000)
DECLARE @colsForPivot VARCHAR(2000)
DECLARE @query VARCHAR(4000)
SELECT @colsForSelect = ISNULL(@colsForSelect + ',','') + ' ISNULL([' + prod_Name + '],0) AS [' + prod_Name + ']',
@colsForPivot = ISNULL(@colsForPivot + ',','') + ' [' + prod_Name + ']'
FROM Products
SET @query = N'SELECT cus_Name,'+ @colsForSelect +'
FROM (
Select cus_Name, prod_Name, SUM(ord_Qty) as sum_ord_Qty
from Orders o
inner join Customers c on c.cus_ID = o.cus_ID
inner join Products p on p.prod_ID = o.Prod_ID
GROUP BY cus_Name, prod_Name
) p
PIVOT (MAX([sum_ord_Qty]) FOR prod_Name IN ( '+ @colsForPivot +' ))
AS pvt;'
EXECUTE(@query);