You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何逐行应用汇率转换函数将混合币种支出转为本地货币?

逐行应用汇率转换函数的解决方案

问题背景

现有自定义函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:55:40