返回日期范围之间所有日期的结果,即使日期没有条目 - oracle

时间:2014-11-20 12:38:46

标签: sql oracle date

我有一个查询需要返回给定日期范围之间所有日期的数据。即使没有数据,查询也需要为日期返回值0。

示例:

DATE    Empid   AMOUNT
20-Jun  10  200
20-Jun  11  300
24-Jun  5   150
25-Jun  17  300
25-Jun  18  200

使用此查询:

SELECT DATE, SUM(AMOUNT) 
From Table A
Where Date between (:FromDate) and (:ToDate)
Group by Date

**Input dates are**: 20-Jun-14 and 25-Jun-14 

结果:

DATE    AMOUNT
20-Jun  500
24-Jun 150
25-Jun 500

我真正追求的是:

DATE    AMOUNT
20-Jun  500
21-Jun  0
22-Jun  0
23-Jun  0
24-Jun 150
25-Jun 500

有没有办法实现这个目标?

谢谢!

2 个答案:

答案 0 :(得分:3)

您需要首先创建一个您感兴趣的所有日期的列表,然后在汇总数字时进行左连接:

with all_dates (the_date) as (
   select (select min(some_date) from a) + level - 1 as the_date
   from dual
   connect by (select min(some_date) from a) + level - 1 <= (select max(some_date) from a)
)
select ad.the_date, coalesce(sum(amount),0) as amount
from all_dates ad
  left join a on a.some_date = ad.the_date
group by ad.the_date
order by ad.the_date;

请注意,我使用some_date作为列名,因为date是保留字,不应用作标识符。

答案 1 :(得分:0)

您可以在请求中创建一个中间表。通过包含日期列表的联接来完成此操作,其中包含您绝对需要响应的所有日期,并使用它代替表A