连接表和 LEFT JOIN 作为 sql 中的新列

Joining tables and LEFT JOIN as new Columns in tsql

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

以上 table 的主要功能是为第三个 table 提供所需的数据,即订单 table

使用订单 table,我可以从客户和产品 table 获得我需要的报告的快速摘要。当我想查看每个客户对每件商品的购买数量时,问题就出现了。

例如这些 table。

使用上面的 tables,我需要创建一个报告来显示每个客户对每件商品的购买次数。

像这样。

我已经使用 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

已更新

旋转这个更有趣,因为大概产品的数量是不固定的。因此,您需要编写一个动态数据透视表来确定基于产品的列!请注意我没有测试下面的内容,但你应该明白了。有关 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);