2016-04-21 75 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; 

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