sql - 用日期表填补日期空白

标签 sql tsql join sql-server-2008-r2 left-join

我有两张 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;

请注意,此版本假定 calendaryearyear(orderdate) 相同。

关于sql - 用日期表填补日期空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451230/

相关文章:

sql - 在 SQL Server 6.5 中选择 TOP 1

sql - 具有反向 LIKE 条件的查询

sql - Oracle-SQL : combine LEFT and INNER JOIN

MySQL 查询 2 个表并从 2 列创建新列

sql - 按多个条件分组

php - 选择一列为 min 的行

mysql - MySql 中的内存表和临时表

SQL 条件案例

tsql - 如何更改包含方括号的 SQL Server 凭据?

sql - ANSI 和非 ANSI 连接有什么区别,您推荐哪种?