我有两个表,Sales
和Returns
。它们具有CustomerID,ProductCode,Name,SalesDate,SalesWeek,SalesAmount和ReturnsDate,ReturnsWeek,ReturnsAmount。我真正想要做的就是加入这些表并将它们叠加在一起,这样客户就可以在单个报表中为销售和退货提供数据。
销售和退货日期不同,但产品代码,客户ID和名称对于输出表中的记录可以相同。例如,客户A上个月买了一个产品并在下个月退货,所以他的记录可以出现在退货表中。
为了达到这个目的,我尝试通过选择两个表之间的所有列来使用union,但是我得到了销售和返回的记录混合而没有一致性。我想做的就是为没有退货业务的客户看到Nulls,反之亦然。我在想这个案例中的Left Join应该可行,但它不起作用。因此,我看到销售和退货金额的所有列中的混合数据。附图是有两张桌子的图片,我看到的输出和我想看到的输出。此外,我正在执行销售和退货金额的每周汇总。实现这一目标的最佳和最简单的方法是什么?对不起,我可能没有正确构建我的问题,但图像可能有助于#NewToSQL
答案 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