使用 Oracle 获取最近十天的销售额,即使这一天有 none

Using Oracle to fetch last ten days of sales, even if day has none

我正在尝试 select 过去 10 天的销售数据,并在没有销售的日期中包含 0。

为此,我正在尝试使用 dual 和 connect by level,但我不知道为什么日期不匹配,查询失败。

这是基本的工作查询:

SELECT 
  current_date - (LEVEL - 1)
  ,(LEVEL - 1)  as result
FROM Dual CONNECT BY Level <= 10
order by result desc

结果:

Current_date-(LEVEL-1) RESULT
13-MAR-15   9
14-MAR-15   8
15-MAR-15   7
16-MAR-15   6
17-MAR-15   5
18-MAR-15   4
19-MAR-15   3
20-MAR-15   2
21-MAR-15   1
22-MAR-15   0

所以我认为这会很好,现在我有了我想要的日期,我可以尝试添加一个子查询来获取销售额(我考虑过加入但不清楚如何加入查询中的级别):

SELECT 
  current_date - (LEVEL - 1)
  ,(select count(1) from sales where for_date=(current_date - (LEVEL - 1))) as sale_volume
  ,(LEVEL - 1)  as result
FROM Dual CONNECT BY Level <= 10
order by result desc

但是,它总是返回 0,即使在我知道有销售的日子也是如此:

Current_date-(LEVEL-1) SALE_VOLUME RESULT
13-MAR-15   0   9
14-MAR-15   0   8
15-MAR-15   0   7
16-MAR-15   0   6
17-MAR-15   0   5
18-MAR-15   0   4
19-MAR-15   0   3
20-MAR-15   0   2
21-MAR-15   0   1
22-MAR-15   0   0
SELECT 
    count(sales.for_Date) 
FROM 
   (SELECT 
       Trunc(current_date) - (LEVEL - 1) as d
   FROM 
       Dual CONNECT BY Level <= 10) as DateRangeTbl
LEFT JOIN
    sales 
ON
    Sales.for_Date = DateRangeTbl.d
GROUP BY
    DateRangeTbl.d

Aheho 给出的解决方案的一个补充 - 您还需要从 Sales.for_Date 列中删除时间部分,否则 ON 子句中的相等条件将不起作用。这可以通过 trunc() 或在 ON 子句中使用 to_char(your-date,date-format) 将两个日期转换为字符串来实现。我用这两种方法让它在我的数据库上工作。日期格式可以是例如 'DD-MON-YYYY'.