2011-06-29 80 views
2

我有兩個表,我需要加入。如何添加基於特定日期範圍的列

第一個表:

EFF_DATE  RATE CURRENCY 
20110101  1.286 USD 
20110201  1.275 USD 
20110301  1.275 USD 
20110401  1.260 USD 
20110501  1.225 USD 

第二個表:

PO_NO TRANS_DATE ACCT_DATE SUPP_NO CURRENCY  LOCAL_AMT 
1000068 20110114 20110115 S016 USD   16,500.00 
1000070 20110214 20110215 S016 USD   7,660.00 
1000072 20110317 20110322 S025 USD   1,080.00 
1000132 20110314 20110315 S037 USD   3,500.00 
1000133 20110414 20110415 S038 USD   14,500.00 

基於ACCT_DATE,我想補充RATE列&的結果應該是這樣的:

PO_NO TRANS_DATE ACCT_DATE SUPP_NO CURRENCY  LOCAL_AMT RATE 
1000068 20110114 20110115 S016 USD   16,500.00 1.286 
1000070 20110214 20110215 S016 USD   7,660.00 1.275 
1000072 20110317 20110322 S025 USD   1,080.00 1.275 
1000132 20110314 20110315 S037 USD   3,500.00 1.275 
1000133 20110414 20110415 S038 USD   14,500.00 1.26 
1000170 20110531 20110531 S016 USD   15,400.00 1.225 

如何通過使用SQL來實現此目的?謝謝!

回答

1

在MySQL中,你會做這樣的事情:下面

SELECT st.*, ft.rate FROM second_table st LEFT JOIN first_table ft ON (MONTH(acct_date) = MONTH(eff_date) AND YEAR(acct_date) = YEAR(eff_date)) 
+0

這將是真正緩慢與大表。 –

1

解決方案假定TRANS_DATE,acct_date和eff_date是int類型。如果它們是日期,則需要使用正確的日期功能,這取決於您的SQL服務器上

SELECT 
    [trans].[po_no] 
    ,[trans].[trans_date] 
    ,[trans].[acct_date] 
    ,[trans].[supp_no] 
    ,[trans].[currency] 
    ,[trans].[local_amt] 
    ,[month_rate].[rate] 
FROM [trans] 
    JOIN [month_rate] on [eff_date]/100 = [trans].[acct_date]/100 
    AND [month_rate].[currency] = [trans].[currency] 
0
select st.*,ft.rate from second_table st,first_table ft 
where to_char(st.acct_date,'YYYYMM')=to_char(ft.eff_date,'YYYYMM') 
0

按你給出的例子,你有EFF_DATE和ACCT_DATE在格式化表格只,所以我覺得你可以直接加入的基礎這兩列

像 -

select st.*,ft.rate from first_table ft, second_table st 
where st.acct_date=ft.eff_date 

但是這不會給你想要的輸出,你所提到的情況在你的問題...

你真的想加入acct_date?

,如果你想剛剛加入沒有這種類型的條件,那麼更好提到的條件,並更新你的問題

0

這將使用的firstTable.t.EFF_DATEsecondTable.ACCT_DATE索引(如果您有索引!)。

調用類似MONTH(),YEAR()等功能的任何解決方案都無法有效使用此類索引。

SELECT st.* 
    , (SELECT ft.RATE 
     FROM firstTable ft 
     WHERE ft.EFF_DATE <= st.ACCT_DATE    
     ORDER BY ft.EFF_DATE DESC 
     LIMIT 1 
     ) AS RATE 
FROM secondTable st 

LIMIT 1是MySQL語法。對於SQL-Server使用SELECT TOP 1