【问题标题】:Calculate Exchange Rates in MS SQL from Currency table with effective date clause使用有效日期子句从货币表计算 MS SQL 中的汇率
【发布时间】:2020-10-01 01:05:29
【问题描述】:

我有一个具有以下结构的货币表,其中每种交易货币的汇率以参考货币(即欧元)维护,但不一定以其他货币为单位。

bcur|curr | effectivedt|Expressinbase|rate
EUR |SAR  |01/04/2020  |1        |12.23
EUR |SAR  |01/05/2020  |1        |12.27 
EUR |SAR  |01/06/2020  |1        |12.29
EUR |INR  |01/04/2020  |1        |77.78
EUR |INR  |01/05/2020  |1        |77.90
EUR |USD  |01/04/2020  |1        |1.34
EUR |GBP  |01/04/2020  |1        |23
EUR |GBP  |01/05/2020  |1        |32
USD |SAR  |01/04/2020  |1        |45
USD |SAR  |01/05/2020  |1        |54
USD |GBP  |01/04/2020  |2        |0.83
INR |SAR  |01/04/2020  |1        |80
.
.

我正在为一些金额选择我的销售订单表,现在我需要根据销售订单表中的交易日期将交易货币金额转换为欧元、美元和印度卢比。

When transaction currency = the currency under consideration assign the amount accordingly
When transaction currency <> the currency then
    if the relation exists is currency table.
        If the rate is maintaied with Expressinbase = 1 then Amount in <curr> = Sales Order Amount / rate
        If the rate is maintaied with Expressinbase = 2 then Amount in <curr> = Sales Order Amount * rate
    If no direct relation is maintained (for USD or INR)
        Amount in <USD or INR> = Amount in EUR/ rate of EUR to <USD or INR>

这对逻辑很有帮助,但我仍然坚持按交易日期从货币表中仅获取 1 条记录

Implicitly Calculate Exchange Rates in SQL from Exchange Rate table

【问题讨论】:

    标签: sql-server left-join currency-exchange-rates


    【解决方案1】:

    我不知道您的订单结构是什么,但您应该能够以类似的方式解决它,只需根据您的条件进行调整

    IF OBJECT_ID(N'tempdb..#currency', N'U') IS NOT NULL   
    DROP TABLE #currency
    
    create table #currency (bcurr VARCHAR(3), curr VARCHAR(3), effectivedt DATETIME, Expressinbase MONEY, rate MONEY)
    
    INSERT INTO #currency VALUES ( 'EUR', 'SAR', '20200401' ,1 ,12.23)
    INSERT INTO #currency VALUES ( 'USD', 'SAR', '20200401' ,1 ,45)
    INSERT INTO #currency VALUES ( 'INR', 'SAR', '20200401' ,1 ,80)
    
    IF OBJECT_ID(N'tempdb..#orders', N'U') IS NOT NULL   
    DROP TABLE #orders
    
    create table #orders (id int IDENTITY(1,1), description VARCHAR(500), price MONEY, currency VARCHAR(3), order_date DATETIME)
    INSERT INTO #orders VALUES('first order', 23.4, 'SAR', '20200401')
    INSERT INTO #orders VALUES('second order', 15.4, 'SAR', '20200401')
    INSERT INTO #orders VALUES('third order', 80.4, 'SAR', '20200401')
    
    ;with prices as (select o.id, o.description, o.price, o.currency,
           priceusd = ( CASE WHEN c.bcurr = 'USD' THEN o.price / c.rate else 0 END),
           priceeur = ( CASE WHEN c.bcurr = 'EUR' THEN o.price / c.rate else 0 END),
           princeinr = ( CASE WHEN c.bcurr = 'INR' THEN o.price / c.rate else 0 END)
    from #orders o 
    inner join #currency c on o.currency = c.curr and o.order_date = c.effectivedt)
    select id, description, price, currency, priceusd= SUM(priceusd),  priceeur = SUM(priceeur), priceinr = SUM(princeinr)
    from prices 
    group by id, description, price, currency
    

    【讨论】:

    • 谢谢……但是日期是 dd/mm/yyyy 格式……我需要获取最新的日期,即
    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2019-07-16
    • 2021-09-12
    相关资源
    最近更新 更多