我有一个查询需要返回给定日期范围之间所有日期的数据。即使没有数据,查询也需要为日期返回值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
有没有办法实现这个目标?
谢谢!
答案 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