将表和LEFT JOIN连接为tsql中的新列

时间:2015-06-18 10:15:23

标签: sql sql-server tsql row

在此示例中,我有两个表格,其中包含我的客户和办公用品商店的产品数据。如下所示:

enter image description here enter image description here

上表主要用于为第三个表提供所需数据,即Orders表

enter image description here

使用订单表,我可以从客户和产品表中快速总结我需要的报告。当我想查看每个项目的每个客户的购买数时,问题就开始了。

例如,像这些表一样。

enter image description here

使用上面的表格,我需要创建一个报告,显示每个项目的每个客户的购买数量。

喜欢这个。

enter image description here

我使用CTERow_number显示项目,但我现在的代码太长了,我目前正在测试某种方式,以最有效和最简洁的方式执行此操作。如果有人可以教会我如何做到这一点,那就更好了。

我不太确定我的问题的标题是否正确,如果看起来不对,我会改变它。

1 个答案:

答案 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);