我有两张 table 。
带有客户和日期的订单表。
来自数据仓库的日期维度表。
订单表不包含给定月份中每个日期的事件,但我需要返回一个结果集来填补日期和客户的空白。
例如,我需要这个:
Customer Date =============================== Cust1 1/15/2012 Cust1 1/18/2012 Cust2 1/5/2012 Cust2 1/8/2012
To look like this:
Customer Date ============================ Cust1 1/15/2012 Cust1 1/16/2012 Cust1 1/17/2012 Cust1 1/18/2012 Cust2 1/5/2012 Cust2 1/6/2012 Cust2 1/7/2012 Cust2 1/8/2012
This seems like a left outer join, but it is not returning the expected results. Here is what I am using, but this is not returning every date from the date table as expected.
SELECT o.customer,
d.fulldate
FROM datetable d
LEFT OUTER JOIN orders o
ON d.fulldate = o.orderdate
WHERE d.calendaryear IN ( 2012 );
最佳答案
问题是您需要所有日期的所有客户。当您执行 left outer join
时,客户字段为 NULL。
下面通过 cross join
ing 客户姓名和日期设置驱动程序表:
SELECT driver.customer, driver.fulldate, o.amount
FROM (select d.fulldate, customer
from datetable d cross join
(select customer
from orders
where year(orderdate) in (2012)
) o
where d.calendaryear IN ( 2012 )
) driver LEFT OUTER JOIN
orders o
ON driver.fulldate = o.orderdate and
driver.customer = o.customer;
请注意,此版本假定
calendaryear
与 year(orderdate)
相同。
关于sql - 用日期表填补日期空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451230/