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 :(得分: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;
注意: - 最好不要使用日期,计算为列名。
答案 1 :(得分:0)
这不是特定于oracle的答案,您需要自己将其翻译为oracle。
创建一个interval表,包含0到999之间的所有整数。如下所示:
linkParams.put("frame", new LinkParams("frame", "src", 0));
linkParams.put("iframe", new LinkParams("iframe", "src", 0));
linkParams.put("script", new LinkParams("script", "src", 0));
linkParams.put("link", new LinkParams("link", "href", 0));
linkParams.put("img", new LinkParams("img", "src", 0));
linkParams.put("source", new LinkParams("source", "src", 0))
然后可以通过将interval.days添加到您获得的第一个日期来确定范围内的所有日期,其中第一个日期+ spacing.days是< =结束日期,结果日期是新的。通过将间隔交叉连接到您自己的表来完成此操作。类似的东西(它将在SQL中,但你需要翻译):
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;
希望这能为您提供一个起点
答案 2 :(得分: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