2012-12-04 71 views
2

我有一張表,它保留入境/出境國內/國際郵件記錄不同日期的記錄。下面是示例表:當數據丟失時插入表

Date   location  in_out_code  dom_int_code   mail_count 
------------------------------------------------------------------------------ 
11/01/2012 chicago    in    I     3 
11/02/2012 la     in    I     2 
11/03/2012 ny     in    I     4 
11/03/2012 ny     out    D     5 
11/04/2012 phoenix    out    D     1 
11/05/2012 phoenix    in    D     3 

我想創建存儲所有組合的每一天,如下所示(爲便於閱讀,我崩潰了輸出)的表:

Date   location   in_out_code  dom_int_code  mail_count 
---------------------------------------------------------------------------- 
11/01/2012 chicago    in    I    3 
11/01/2012 chicago    in    D    0 <-- inserted 
11/01/2012 chicago    out    I    0 <-- inserted 
11/01/2012 chicago    out    D    0 <-- inserted 

11/02/2012 la     in    I    2 
11/02/2012 la     in    D    0 <-- inserted 
11/02/2012 la     out    I    0 <-- inserted 
11/02/2012 la     out    D    0 <-- inserted 

11/03/2012 ny     in    I    4 
11/03/2012 ny     in    D    0 <-- inserted 
11/03/2012 ny     out    I    0 <-- inserted 
11/03/2012 ny     out    D    5 

11/04/2012 phoenix    in    I    0 <-- inserted 
11/04/2012 phoenix    in    D    0 <-- inserted 
11/04/2012 phoenix    out    I    0 <-- inserted 
11/04/2012 phoenix    out    D    1 

11/05/2012 phoenix    in    I    0 <-- inserted 
11/05/2012 phoenix    in    D    3 
11/05/2012 phoenix    out    I    0 <-- inserted 
11/05/2012 phoenix    out    D    0 <-- inserted 

怎麼會我這樣做。任何建議?

謝謝

+0

使用while循環創建臨時表。獲取每個國家每天的最小和最大日期循環,並插入每個組合的 – CR41G14

+0

@ CR41G14像這樣使用循環效率非常低。 –

回答

3

Oracle 10g及更高版本。您可以使用partition by擴展的外部聯接填補空白數據:

表與您所提供的數據:

SQL> create table Your_Table_Name(Date1, location1, in_out_code, dom_int_code, mail_count) as(
    2 select to_date('11/01/2012', 'mm/dd/yyyy'), 'chicago', 'in', 'I', 3 from dual union all 
    3 select to_date('11/02/2012', 'mm/dd/yyyy'), 'la'  , 'in', 'I', 2 from dual union all 
    4 select to_date('11/03/2012', 'mm/dd/yyyy'), 'ny'  , 'in', 'I', 4 from dual union all 
    5 select to_date('11/03/2012', 'mm/dd/yyyy'), 'ny'  , 'out', 'D', 5 from dual union all 
    6 select to_date('11/04/2012', 'mm/dd/yyyy'), 'phoenix', 'out', 'D', 1 from dual union all 
    7 select to_date('11/05/2012', 'mm/dd/yyyy'), 'phoenix', 'in' , 'D', 3 from dual 
    8 ) 
    9 ; 

Table created 

我們查詢:

SQL> with t2(in_out_code, dom_int_code) as(
    2 select 'in', 'I' from dual union all 
    3 select 'out', 'I' from dual union all 
    4 select 'in', 'D' from dual union all 
    5 select 'out', 'D' from dual 
    6 ) 
    7 select t1.date1 
    8  , t1.location1 
    9  , t2.in_out_code 
10  , t2.dom_int_code 
11  , nvl(t1.mail_count, 0) as mail_count 
12 from your_table_name t1 
13 partition by (t1.date1, t1.location1) 
14 right outer join t2 
15  on (t1.in_out_code = t2.in_out_code and 
16   t1.dom_int_code = t2.dom_int_code) 
17 ; 

結果:

DATE1  LOCATION1 IN_OUT_CODE DOM_INT_CODE MAIL_COUNT 
----------- --------- ----------- ------------ ---------- 
11/01/2012 chicago in   D      0 
11/01/2012 chicago in   I      3 
11/01/2012 chicago out   D      0 
11/01/2012 chicago out   I      0 
11/02/2012 la  in   D      0 
11/02/2012 la  in   I      2 
11/02/2012 la  out   D      0 
11/02/2012 la  out   I      0 
11/03/2012 ny  in   D      0 
11/03/2012 ny  in   I      4 
11/03/2012 ny  out   D      5 
11/03/2012 ny  out   I      0 
11/04/2012 phoenix in   D      0 
11/04/2012 phoenix in   I      0 
11/04/2012 phoenix out   D      1 
11/04/2012 phoenix out   I      0 
11/05/2012 phoenix in   D      3 
11/05/2012 phoenix in   I      0 
11/05/2012 phoenix out   D      0 
11/05/2012 phoenix out   I      0 

20 rows selected 
+0

:能否請你解釋第13行,這個語法對我來說是新的,或者是任何參考文檔。 –

+1

我認爲你應該在(t1.date1,t1.location1)上進行分區,並刪除不應該被要求的分析數據?即你應該只有'select date1,location1,t2.in_out_code,t2.dom_int_code,nvl(t1.mail_count,0)' – DazzaL

+0

@GauravSoni基本上外連接應用於'partition by'子句中指定的組。我在答案中添加了對文檔的引用。 –