如何在SQL中同时实现Vlookup匹配与乘法运算?
用SQL实现发票金额按季度汇率转换为USD
要实现你要的效果,核心是用JOIN关联两张表的币种(对应Excel的VLOOKUP匹配逻辑),然后对每个月的发票金额乘以对应季度的汇率,生成目标列。
假设表结构(可根据实际表名/字段名替换)
- 汇率表:
exchange_rates,字段:Currency(币种代码,如USD、EUR)、Q1_Exchange_Rate(第一季度汇率)、Q2_Exchange_Rate(第二季度汇率) - 发票表:
invoices,字段:Invoice_ID(发票ID,可选)、Currency(发票币种)、Jan_Amount(1月本地货币金额)、Feb_Amount(2月)、Mar_Amount(3月)、Apr_Amount(4月)、May_Amount(5月)、Jun_Amount(6月)
核心SQL代码
SELECT inv.Invoice_ID, inv.Currency, -- Q1月份(1-3月)用Q1汇率计算USD金额 inv.Jan_Amount * er.Q1_Exchange_Rate AS Jan_USD, inv.Feb_Amount * er.Q1_Exchange_Rate AS Feb_USD, inv.Mar_Amount * er.Q1_Exchange_Rate AS Mar_USD, -- Q2月份(4-6月)用Q2汇率计算USD金额 inv.Apr_Amount * er.Q2_Exchange_Rate AS Apr_USD, inv.May_Amount * er.Q2_Exchange_Rate AS May_USD, inv.Jun_Amount * er.Q2_Exchange_Rate AS Jun_USD, -- 可选:保留原本地货币金额列 inv.Jan_Amount, inv.Feb_Amount, inv.Mar_Amount, inv.Apr_Amount, inv.May_Amount, inv.Jun_Amount FROM invoices inv INNER JOIN exchange_rates er ON inv.Currency = er.Currency;
关键说明
- JOIN的作用:
INNER JOIN ... ON inv.Currency = er.Currency完全对应Excel中VLOOKUP匹配币种的逻辑,只保留两张表中币种完全匹配的记录。如果需要保留所有发票(哪怕没有对应汇率),把INNER JOIN改成LEFT JOIN即可,此时无匹配汇率的行,计算结果会是NULL。 - 字段名带空格的处理:如果你的汇率表字段是
Q1 Echange Rate(注意拼写的是Echange,正确为Exchange)这类带空格的名称,需要用引号包裹:- SQL Server:
er.[Q1 Echange Rate] - PostgreSQL/MySQL:
er."Q1 Echange Rate"
- SQL Server:
- 无汇率的兜底处理:用
LEFT JOIN时,可通过COALESCE函数给无汇率的情况设置默认值(比如用1,即原金额):inv.Jan_Amount * COALESCE(er.Q1_Exchange_Rate, 1) AS Jan_USD - 币种格式一致性:确保两张表的
Currency字段格式统一(比如都是大写USD,或者都是小写usd),避免匹配失败。
内容的提问来源于stack exchange,提问作者Mya_H
相关产品推荐
相关产品推荐

