我有两张表。
带有客户和日期的订单表。数据仓库中的日期维度表。
订单表并不包含给定月份中每个日期的活动,但是我需要返回一个填充日期和客户缺口的结果集。
例如,我需要这个:
Customer Date =============================== Cust1 1/15/2012 Cust1 1/18/2012 Cust2 1/5/2012 Cust2 1/8/2012
看起来像这样:
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
这似乎是一个左外部联接,但它没有返回预期的结果。这是我正在使用的内容,但这并没有按预期返回日期表中的每个日期。
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,customer字段将为NULL。
left outer join
下面通过cross join输入客户名称和日期来设置驱动程序表:
cross join
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)。
calendaryear
year(orderdate)