在此示例中,我有一个包含数据,我的客户和一个办公用品商店有产品的两个表。 这将在下面看到的:
上述表的主要作用是提供所需要的数据的第三表是订单表
使用订单表,我可以得到我从客户和产品表需要报告的简要总结。 当我想看到每个项目的每个客户的购买数量的问题开始。
像这些表例如。
使用上面的表,我需要创建一个报告,显示每个项目的每个客户的购买数量。
像这样。
我已经使用CTE
显示由项目Row_number
但我现在的代码是相当太长,我目前正在测试的一些方法来做到这一点的最有效和最简洁的方式。 如果有人可以教我如何做到这一点的短方式,将是巨大的。
我不是很肯定,如果我的问题的标题是正确的,我会如果它似乎不正确更改。
因此,第一步将是与你的基本查询开始。 这给你的最后报告信息,但在错误的格式。 现在所有这一切都需要的是转动它。
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
更新
摆动,这是更有趣,想必产品的数量是不固定的。 因此,你需要写一个动态的支点,以确定基于产品列! 请注意,我没有测试以下,但你应该明白我的意思。 请参照上的帖子过多动态枢轴上支点进一步的问题:
见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);