2014-02-13 27 views
0

假設我在oracle數據庫中有兩個表 - 一個包含月度數據,另一個包含每日數據,例如,如下所示:Oracle - 按日期加入兩個表,其中一個是每日,一個是每月

TblMonthlyData:

MonMatchingCol: MonDateCol: MonCol3:  MonCol4: 
a     01-31-2014  MonVal3a  MonVal4a 
b     01-31-2014  MonVal3b  MonVal4b 
a     12-31-2013  MonVal3c  MonVal4c 
b     12-31-2013  MonVal3d  MonVal4d 
a     11-30-2013  MonVal3e  MonVal4e 
b     11-30-2013  MonVal3f  MonVal4f 

TblDailyData:

DlyMatchingCol DlyDateCol DlyCol3 DlyCol4 
a    01-14-2014 DlyVal3a DlyVal4a 
b    01-14-2014 DlyVal3b DlyVal4b 
a    01-15-2014 DlyVal3c DlyVal4c 
b    01-15-2014 DlyVal3d DlyVal4d 
a    01-16-2014 DlyVal3e DlyVal4e 
b    01-16-2014 DlyVal3f DlyVal4f 
... 
a    02-01-2014 DlyVal3g DlyVal4g 
b    02-01-2014 DlyVal3h DlyVal4h 
a    02-02-2014 DlyVal3i DlyVal4i 
b    02-02-2014 DlyVal3j DlyVal4j 

和我有FO llowing查詢:

SELECT 
    Daily.DlyDateCol, Daily.DlyMatchingCol, Daily.DlyCol3, Daily.DlyCol4, Monthly.MonCol3, Monthly.MonCol4 
FROM 
    TblDailyData Daily, 
    TblMonthlyData Monthly 
WHERE 
    Daily.DlyDateCol = '01-14-2014' 
    AND 
    Monthly.MonDateCol = (SELECT MAX(MonDateCol) 
          FROM TblMonthlyData 
          WHERE TblMonthlyData.MonDateCol <= '01-14-2014') 
    AND 
    Daily.DlyMatchingCol = Monthly.MonMatchingCol 

基本上,我在我的月度表在我的日常表每天的數據和月數據,他們有一列將兩者結合起來,我想獲取最新的月度數據向上那麼我們從日常表中拉出來。

所以,這個查詢的結果將是:

DlyDateCol: DlyMatchingCol: DlyCol3: DlyCol4: MonCol3: MonCol4: 
01-14-2014 a     DlyVal3a DlyVal4a MonVal3c MonVal4c  
01-14-2014 b     DlyVal3b DlyVal4b MonVal3d MonVal4d  

現在,這個查詢的偉大工程,但現在我需要擴展它,這樣我可以在拉多天的數據時間(所以不再僅僅爲01-14-2014,但現在爲01-15-2014 to 02-10-2014)?

該查詢將如下的結果如下:

DlyDateCol: DlyMatchingCol: DlyCol3: DlyCol4: MonCol3: MonCol4: 
01-15-2014 a     DlyVal3c DlyVal4c MonVal3c MonVal4c  
01-15-2014 b     DlyVal3d DlyVal4d MonVal3d MonVal4d  
01-16-2014 a     DlyVal3e DlyVal4e MonVal3c MonVal4c  
01-16-2014 b     DlyVal3f DlyVal4f MonVal3d MonVal4d  
... 
02-01-2014 a     DlyVal3g DlyVal4g MonVal3a MonVal4a  
02-01-2014 b     DlyVal3h DlyVal4h MonVal3b MonVal4b  
02-02-2014 a     DlyVal3i DlyVal4i MonVal3a MonVal4a  
02-02-2014 b     DlyVal3j DlyVal4j MonVal3b MonVal4b  
... 

所以,基本上,每天的數據每天都會變化,但月度數據會隨着幾個月的變化而變化。

我希望這是有道理的。

非常感謝您的幫助!

+0

你能提供一些樣本數據和想要的結果嗎? –

+0

如果你有條件'Daily.DlyMatchingCol = Monthly.MonMatchingCol',爲什麼你需要選擇'Monthly.MonDateCol'值的子查詢? –

+0

@GordonLinoff,我在假樣本數據中添加了 - 我很抱歉沒有這樣做,這只是很多類型,我希望我很好地解釋自己...我希望現在有道理.... –

回答

0

MUCH玩弄後,我想出了這個偉大的工作的解決方案 - 把這個在這裏如果任何人有一個類似的問題:

SELECT 
    Daily.DlyDateCol, Daily.DlyMatchingCol, Daily.DlyCol3, Daily.DlyCol4, Monthly.MonCol3, Monthly.MonCol4 
FROM 
    TblDailyData Daily, 
    TblMonthlyData Monthly 
WHERE 
    Daily.DlyDateCol BETWEEN '01-15-2014' AND '02-10-2014' 
    AND 
    Monthly.MonDateCol = (SELECT MAX(MonDateCol) 
          FROM TblMonthlyData 
          WHERE MonDateCol <= Daily.DlyDateCol) 
    AND 
    Daily.DlyMatchingCol = Monthly.MonMatchingCol 

這裏的整個真正的技巧在MonDateCol <= Daily.DlyDateCol簡單地把 - 這使他們relativ e(每個行都按照我的意願),因此日期正確流通。

我希望這是有道理的,並再次感謝您的所有幫助!

+0

之前我沒有看到這個答覆:/看起來這樣也會起作用。當我最初編寫它時,我沒有看到每月日期列是每日表格上的那個月的前一個月的結尾。我認爲1/15和1/16等將在1月31日的月度表上上漲(因爲它們是在1月份)。 –

1

試試這個 -

SQL小提琴(更新14年2月16日)在這裏:http://sqlfiddle.com/#!4/d41d8/25423/0

select d.*, m.mondatecol, m.moncol3, m.moncol4 
    from tbldailydata d 
    join tblmonthlydata m 
    on d.dlymatchingcol = m.monmatchingcol 
where m.mondatecol = 
     (select max(x.mondatecol) 
      from tblmonthlydata x 
     where add_months(to_date(d.dlydatecol, 'MM-DD-YYYY'), -1) <= 
       to_date(x.mondatecol, 'MM-DD-YYYY') 
      and m.monmatchingcol = x.monmatchingcol) 
    and d.dlydatecol between '01-15-2014' and '02-10-2014' 
+0

非常感謝你提出這個解決方案,我對缺少樣本數據表示歉意。但我覺得我只是表達自己錯了。我現在用樣本數據更新了問題 - 基本上,我想從每日表格中獲取每日數據,並且每月的數據會每天重複一次,直到新月份出現在每月表格中 - I ** HOPE **現在有道理! –

+0

我想我明白了,我只做了2次編輯,確保它是最後一次嘗試,我忘記了子查詢中的連接。我會盡我所能在sqlfiddle中嘗試它,但我認爲我會給你測試,以防你更快地進行測試。 –

+0

非常感謝您在此ShWiVeL上的工作 - 您發佈的SQL小提琴似乎只從每月的1/31數據中提取兩個月的數據,而它應該在12/31中提取1月的結果。 ... 有什麼想法嗎? –

相關問題