如何根据特定日期范围添加列

时间:2011-06-29 09:13:50

标签: sql

我有两张桌子需要加入。

第一张表:

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实现此目的?谢谢!

5 个答案:

答案 0 :(得分: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) )

答案 1 :(得分:1)

下面的解决方案假设trans_date,acct_date和eff_date是int。如果它们是日期,则需要根据SQL Server使用正确的日期函数

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]

答案 2 :(得分: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')

答案 3 :(得分: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 ???

如果您想在没有此类条件的情况下加入,请更好地提及该条件并更新您的问题

答案 4 :(得分: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