【问题标题】:Joining tables and LEFT JOIN as new Columns in tsql将表和 LEFT JOIN 连接为 sql 中的新列
【发布时间】:2015-09-03 22:15:20
【问题描述】:

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

上述表格的主要功能是为第三个表格即订单表格提供所需的数据

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

例如这些表格。

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

像这样。

我使用CTE 来显示Row_number 的项目,但我现在的代码太长了,我目前正在测试一些最有效和最简洁的方法。如果有人可以教我如何以更短的方式做到这一点,那就太好了。

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

【问题讨论】:

  • 最好发布可以复制和粘贴的数据而不是图像,然后人们可以尝试复制它而无需手动输入您的数据。更好的是,编写一个脚本,该脚本将使用您的示例数据填充一个临时表,并使用您想要的输出显示问题。

标签: sql sql-server tsql row


【解决方案1】:

所以第一步是从您的基本查询开始。这会为您提供最终报告信息,但格式错误。现在需要做的就是旋转它。

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

【讨论】:

  • 我明白了我应该如何处理你的答案的要点,但是我没有使用代码获得所需的输出。代码在单个列中输出交易中涉及的产品,这与我想要的输出有点偏离。
  • @chloe。这将是支点。阅读枢轴的工作原理。我会在接下来的几个小时内尝试更新我的答案。
  • @Chloe 我已经更新了答案以包含一个 SQLFiddle 示例。这现在按预期工作\询问。
  • 我正在尝试在查询中使用WHERE 子句,但我似乎无法使其工作。你能再帮我看看怎么做吗?或者我会为此提出另一个问题。非常感谢。
  • 在最后一个 INNER JOIN 之后和 GROUP BY 之前添加 WHERE 子句。您能更详细地解释您要做什么吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2021-04-25
  • 2010-09-29
相关资源
最近更新 更多