2016-04-21 37 views
0
 
table A 
no date  count 
1 20160401 1 
1 20160403 4 
2 20160407 3 
 
result 
no date  count 
1 20160401 1 
1 20160402 0 
1 20160403 4 
1 20160404 0 
. 
. 
. 
2 20160405 0 
2 20160406 0 
2 20160407 3 
. 
. 
. 

我使用Oracle失踪日期范围的日期,我想写一个基于表A填写从表

为范围内的每个日期返回行的查询Oracle有一些可以帮助我的功能吗?

+0

有一个很好的机会,已经有堆栈溢出的答案。当然,必须有办法加入date * x *和* y *之间的日历表并将您的结果加入到该日历中?虽然我找不到它。希望有人更熟悉Oracle标签可以! :) –

+0

只是为了澄清。这些是表格而不是分组/聚合查询的结果? –

+0

你的要求是什么? +你尝试过什么?你是否真的写了一些查询或试图这样做来实现你所寻找的结果?如果是这样,请分享一下。此外,如果可能的话,请解释用普通英语构造数据输出所需的逻辑(如果您愿意,可以使用+技术术语)。 – Annjawn

回答

0

试试这个:

with 
    A as (
    select 1 no, to_date('20160401', 'yyyymmdd') dat, 1 cnt from dual union all 
    select 1 no, to_date('20160403', 'yyyymmdd') dat, 4 cnt from dual union all 
    select 2 no, to_date('20160407', 'yyyymmdd') dat, 3 cnt from dual), 
    B as (select min(dat) mindat, max(dat) maxdat from A t), 
    C as (select level + mindat - 1 dat from B connect by level + mindat - 1 <= maxdat), 
    D as (select distinct no from A), 
    E as (select * from D,C) 
select E.no, E.dat, nvl(cnt, 0) cnt 
from E 
full outer join A on A.no = E.no and A.dat = E.dat 
order by 1, 2, 3 
0

这不是一个oracle特定的答案,你需要自己将它翻译成oracle。

创建间隔表,包含所有整数从0到999之间的事情是这样的:

CREATE TABLE intervals (days int); 
INSERT INTO intervals (days) VALUES (0), (1); 
DECLARE @rc int; 
SELECT @rc = 2; 
WHILE (SELECT Count(*) FROM intervals) < 1000 BEGIN 
    INSERT INTO intervals (days) SELECT days + @rc FROM intervals WHERE days + @rc < 1000; 
    SELECT @rc = @rc * 2 
END; 

然后在范围内的所有日期,可以通过添加intervals.days一个你的第一个日期标识得到,第一个日期+间隔时间为< =结束日期,结果日期是新的。通过将间隔交叉连接到自己的表格来完成此操作。喜欢的东西(它会在SQL,但同样你需要翻译):

SELECT DateAdd(a.date, d, i.days) 
FROM (select min(date) from table_A) a, intervals I 
WHERE DateAdd(a.date, d, i.days) < (select max(date) from table_A) 
    AND NOT EXISTS (select 1 from table_A aa where aa.date = DateAdd(a.date, d, i.days)) 

希望这给你一个起点

1

可以使用SEQUENCES

首先创建一个序列

Create Sequence seq_name start with 20160401 max n; 

其中n是最大值,直到ü要显示。

然后使用SQL

select seq_name.next,case when seq_name.next = date then count else 0 end from tableA; 

注: - 它最好不要使用日期,算的列名。