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

Sql 如何根据特定日期范围添加列,sql,Sql,我有两张桌子需要合并 第一张表: 第二表: 基于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,66

我有两张桌子需要合并

第一张表:

第二表:

基于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实现这一点?谢谢

在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) )

下面的解决方案假定trans_date、acct_date和eff_date为int。如果它们是date,则需要根据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]

根据你们给出的例子,你们只有EFF_日期和ACCT_日期的格式,所以我认为你们可以直接连接这两列的基础

像-

select st.*,ft.rate from first_table ft, second_table st
where st.acct_date=ft.eff_date
但这并不能提供您在问题中提到的所需输出

你真的想加入acct_date吗

如果您想在没有此类条件的情况下直接加入,那么最好提及该条件并更新您的问题

如果有索引,这将使用firstTable.t.EFF_DATE和secondTable.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 

限制1是MySQL语法。对于SQL Server,请选择TOP 1。

对于大型表,这将非常缓慢。
select st.*,ft.rate from second_table st,first_table ft 
where to_char(st.acct_date,'YYYYMM')=to_char(ft.eff_date,'YYYYMM')
select st.*,ft.rate from first_table ft, second_table st
where st.acct_date=ft.eff_date
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