如何逐行应用汇率转换函数将混合币种支出转为本地货币?
逐行应用汇率转换函数的解决方案
问题背景
现有自定义函数dbo.fn_KurBul (@DATE, @EXCHANGERATE, 1)用于汇率转换,参数规则:
@DATE:传入当前日期@EXCHANGERATE:0=土耳其里拉,1=美元,2=欧元
需要对支出记录逐行应用该函数完成汇率转换,但之前通过变量计算仅能得到单一值,无法实现逐行处理。表中AYLIKGIDER对应MONTHPRICE(月支出),YILLIKGIDER对应YEARPRICE(年支出)。
现有查询代码
原查询仅拼接汇率标识,未实现实际汇率转换:
SELECT T.UserTableID, SERVICEID, F.COMPANYNAME, TEXT1, CONVERT(INT,Periot), StartDate, EndDate, T.YEAR, DATEDIFF( day,GETDATE(),EndDate ), CONVERT( nvarchar, CONVERT(INT,(MONTHPRICE)) ) + ExchangeRate, CONVERT(nvarchar,YEARPRICE) + ExchangeRate FROM TABLE1 AS T WITH (NOLOCK) LEFT OUTER JOIN TABLE2 F WITH(NOLOCK) ON F.COMPANYNAME = T.COMPANYNAME
错误尝试(仅返回单一值)
通过声明变量计算时,只会获取结果集最后一行的计算值,无法实现逐行处理:
DECLARE @dolarprice int SELECT @dolarprice = MONTHPRICE * dbo.fn_getexchangerate( GETDATE(), 2, 1 ) FROM TABLE WHERE EXCHANGERATE = '$' ORDER BY MONTH
正确逐行转换方案
直接在SELECT语句中对每行的MONTHPRICE和YEARPRICE调用汇率函数,同时根据每行的ExchangeRate字段映射到函数所需的参数值即可:
场景1:ExchangeRate字段存储符号(如$、€、₺)
通过CASE语句将符号转换为函数需要的数字参数:
SELECT T.UserTableID, SERVICEID, F.COMPANYNAME, TEXT1, CONVERT(INT, Periot), StartDate, EndDate, T.YEAR, DATEDIFF(day, GETDATE(), EndDate), -- 月支出按对应汇率转换 MONTHPRICE * dbo.fn_KurBul(GETDATE(), CASE T.ExchangeRate WHEN '$' THEN 1 WHEN '€' THEN 2 WHEN '₺' THEN 0 ELSE 0 -- 默认使用土耳其里拉 END, 1) AS ConvertedMonthPrice, -- 年支出按对应汇率转换 YEARPRICE * dbo.fn_KurBul(GETDATE(), CASE T.ExchangeRate WHEN '$' THEN 1 WHEN '€' THEN 2 WHEN '₺' THEN 0 ELSE 0 END, 1) AS ConvertedYearPrice, -- 保留原汇率标识(可选) T.ExchangeRate FROM TABLE1 AS T WITH (NOLOCK) LEFT OUTER JOIN TABLE2 F WITH(NOLOCK) ON F.COMPANYNAME = T.COMPANYNAME
场景2:ExchangeRate字段直接存储0/1/2数字参数
可直接传入字段值,简化调用:
SELECT T.UserTableID, SERVICEID, F.COMPANYNAME, TEXT1, CONVERT(INT, Periot), StartDate, EndDate, T.YEAR, DATEDIFF(day, GETDATE(), EndDate), MONTHPRICE * dbo.fn_KurBul(GETDATE(), T.ExchangeRate, 1) AS ConvertedMonthPrice, YEARPRICE * dbo.fn_KurBul(GETDATE(), T.ExchangeRate, 1) AS ConvertedYearPrice, T.ExchangeRate FROM TABLE1 AS T WITH (NOLOCK) LEFT OUTER JOIN TABLE2 F WITH(NOLOCK) ON F.COMPANYNAME = T.COMPANYNAME
关键说明
- 无需声明变量,直接在SELECT的字段表达式中逐行调用函数,每行数据会独立计算转换后的值
- 确保CASE语句中的汇率标识与表中
ExchangeRate字段的实际值完全匹配,避免映射错误 - 如果需要保留「原金额+汇率标识」的格式,可将转换后的值拼接标识,示例:
CONVERT(nvarchar, MONTHPRICE * dbo.fn_KurBul(...)) + ' ' + T.ExchangeRate
内容的提问来源于stack exchange,提问作者Lashekhan
相关产品推荐
相关产品推荐

