堆叠来自具有不同日期的两个表的数据

时间:2017-09-14 20:40:57

标签: sql sql-server tsql

我有两个表,SalesReturns。它们具有CustomerID,ProductCode,Name,SalesDate,SalesWeek,SalesAmount和ReturnsDate,ReturnsWeek,ReturnsAmount。我真正想要做的就是加入这些表并将它们叠加在一起,这样客户就可以在单个报表中为销售和退货提供数据。

销售和退货日期不同,但产品代码,客户ID和名称对于输出表中的记录可以相同。例如,客户A上个月买了一个产品并在下个月退货,所以他的记录可以出现在退货表中。

为了达到这个目的,我尝试通过选择两个表之间的所有列来使用union,但是我得到了销售和返回的记录混合而没有一致性。我想做的就是为没有退货业务的客户看到Nulls,反之亦然。我在想这个案例中的Left Join应该可行,但它不起作用。因此,我看到销售和退货金额的所有列中的混合数据。附图是有两张桌子的图片,我看到的输出和我想看到的输出。此外,我正在执行销售和退货金额的每周汇总。实现这一目标的最佳和最简单的方法是什么?对不起,我可能没有正确构建我的问题,但图像可能有助于#NewToSQL

enter image description here

2 个答案:

答案 0 :(得分:1)

据推测,顾客可以多次购买特定产品。如果是这样,full join是正确的解决方案,但您需要更多逻辑来确保结果中不重复:

select . . .
from (select s.*,
             row_number() over (partition by product_code, customer_id order by (select NULL)) as seqnum
      from sales s
     ) s full join
     (select r.*,
             row_number() over (partition by product_code, customer_id order by (select NULL)) as seqnum
      from returns r
     ) r
     on s.product_code = r.product_code and s.customer_id = r.customer_id;

我将该名称删除,因为我认为它是由客户ID定义的。

答案 1 :(得分:0)

您需要在您提到的那些列上使用返回表执行FULL JOIN销售表。

类似的东西:

SELECT *
FROM sales s
FULL JOIN returns r
ON s.product_code = r.product_code
AND s.customerid = r.customer_id