我有两张桌子需要加入。
第一张表:
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实现此目的?谢谢!
答案 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_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
LIMIT 1
是MySQL语法。对于SQL-Server,请使用SELECT TOP 1
。