在SQL Server T-SQL中处理货币转换

时间:2018-10-18 15:24:44

标签: sql-server tsql currency-exchange-rates

我试图在MS SQL Server T-SQL中构建SQL脚本,以将“销售发票收入”度量划分为4个代表以下内容的度量:

  • 交易销售收入=原始货币收入
  • 房屋销售收入=以 本地分区货币(本币)
  • 加元的合并销售收入=所有合并的销售金额 加拿大货币
  • 合并销售收入(美元)=所有合并的销售金额 美国货币

这是我为了满足以上要求而尝试编写的代码:

    Main_InvoiceTable AS
(   --This is the root query, retrieving rows from OrderHeader Table
    select  frhkrg.* ,
            convert(money, isnull(x.rate_exchange, 1))  as TMP_ExchangeRate,
            coalesce(source_currency,'NA') as TMP_SourceTransactionCurrencyType,
            coalesce(target_currency,'NA') as TMP_TargetTransactionCurrencyType
    from    frhkrg
                LEFT OUTER JOIN rates x --Note, the rate here is to convert FROM USD to CAD (USD * RATE = CAD)
                    on CONVERT(varchar(6), frhkrg.fakdat, 112) = convert(varchar(4),year(x.date_l)) + 
case
    when convert(varchar(2), month(x.date_l)) < 10 then '0' +  convert(varchar(2), month(x.date_l))
    else  convert(varchar(2), month(x.date_l)) end
),

,Home_Currency as 
(
    SELECT  Entity.[Legal Entity Code] as EntityCode,
            Entity.[Legal Entity Desc] as EntityName,
            Entity.[Local Currency] as EntityCurrency
    from    dbo.tmpBU Entity
    group by
            Entity.[Legal Entity Code],
            Entity.[Legal Entity Desc],
            Entity.[Local Currency]
),

Main_Query as
(
select
 Main_InvoiceTable.faknr    as [Invoice Num]
,Main_InvoiceTable.fakdat as    [Invoice Date]
,Main_InvoiceTable.ordernr as [Sales Order Number]
,InvoiceDetail.esr_aantal as [Sales Revenue]

    ,Home_Currency.EntityCurrency as [Home Currency Cd]
    ,Main_InvoiceTable.TMP_SourceTransactionCurrencyType  as [Source Transaction Currency Cd]
    ,Main_InvoiceTable.TMP_TargetTransactionCurrencyType  as [Target Transaction Currency Cd]
    ,Main_InvoiceTable.TMP_ExchangeRate as [US/CDN Exchange Rate]

--If the transaction currency Code is different than the Home Currency Code then do the following conditional logic 
            ,case   when Home_Currency.EntityCurrency = 'USD' AND Main_InvoiceTable.TMP_SourceTransactionCurrencyType = 'USD'
                        then 1 --SourceCurrency and Homecurrency are the same, no need to convert.

                    when Home_Currency.EntityCurrency = 'USD' AND Main_InvoiceTable.TMP_SourceTransactionCurrencyType= 'CAD'
                        then 1 / Main_InvoiceTable.TMP_ExchangeRate --convert from CAD to USD, use the reverse of the conversion rate

                    when Home_Currency.EntityCurrency = 'CAD' AND Main_InvoiceTable.TMP_SourceTransactionCurrencyType = 'USD'
                        then Main_InvoiceTable.TMP_ExchangeRate --if we need to convert from USD to CAD, use the "direct" conversion rate

                    when Home_Currency.EntityCurrency = 'CAD' AND Main_InvoiceTable.TMP_SourceTransactionCurrencyType = 'CAD'
                        then 1 --SourceCurrency and Homecurrency are the same, no need to convert.
                    else 1
                end as TMP_Convert_To_Entity_Currency,

            case    when Main_InvoiceTable.TMP_SourceTransactionCurrencyType <> 'CAD' 
                    then Main_InvoiceTable.TMP_ExchangeRate --to convert FROM USD to CAD
                    else 1 --consolidated Currency should be either CAD or in USD (currently, the logic dictates that consolidated is always in CAD)
                end as TMP_Convert_To_Consolidated_Currency

            from    Main_InvoiceTable
                    join    Home_Currency on Main_InvoiceTable.[Division Code] = Home_Currency.EntityCode
                    join    dbo.frhsrg InvoiceDetail on Main_InvoiceTable.faknr = InvoiceDetail.faknr
)

select
 [Invoice Num]
,[Invoice Date]
,[Sales Order Number]
,[Sales Revenue] as [Transaction Sales Revenue]
,[Sales Revenue] * TMP_Convert_To_Entity_Currency as [Entity Sales Revenue]
,[Sales Revenue] * TMP_Convert_To_Consolidated_Currency as [Consolidated Sales Revenue]

from Main_Query

group by 
 [Invoice Num]
,[Invoice Date]
,[Sales Order Number]
,[Sales Revenue]
,TMP_Convert_To_Entity_Currency
,TMP_Convert_To_Consolidated_Currency

以下是一些表中的示例数据: Sample date from Main Invoice Header, Home Currency, and Exchange Rates tables

Main Invoice Table Header Query
-------------------------------
Invoice Num | Invoice Date  | Order Num | Order Date   | Division Code | Warehouse | Exchange Rate | Source Currency | Target Currency
5000001     | July-20-18    | 50052     | June-18-18   | 859           | _MTL      | 1.3017        | USD             | CAD
5000001     | July-20-18    | 50052     | June-18-18   | 859           | _MTL      | 1.5239        | EUR             | CAD
6000001     | October-30-18 | 60033     | August-22-18 | 952           | _ARIZONA  | 1.0000        | USD             | USD
6000001     | October-30-18 | 60033     | August-22-18 | 952           | _ARIZONA  | 1.1502        | EUR             | USD

Home Currency Query
-------------------                             
Division Code | Division Name                    | Home Currency                        
199           | T Reliable Manufacturing Inc.    | USD                      
200           | C Verification Technologies Inc. | USD                      
330           | T France  SARL                   | EUR                      
400           | LauchWorks  LLC                  | CAD  
859           | C Industries (2007) ULC -MTL     | CAD                      
889           | C (2007) ULC -VCR                | CAD                      
952           | DDL  LLC                         | USD                      
999           | N Petrochemicals                 | CAD                      

Exchange Rate Table
-------------------                         
source_currency | target_currency | date_l          | rate_exchange | Division              
CAD             | EUR             | September-02-12 | 1             | 859               
CAD             | GBP             | September-02-12 | 1             | 859               
CAD             | USD             | August-30-12    | 1             | 859               
EUR             | ATS             | January-01-99   | 13.7603       | NULL              
EUR             | BEF             | January-01-99   | 40.3399       | NULL              
EUR             | CAD             | May-31-07       | 1.4536        | 859               
EUR             | CAD             | June-08-07      | 1.4173        | 859               
USD             | CAD             | August-31-18    | 1.3055        | 859               
USD             | CAD             | September-30-18 | 1.2945        | 859           

我相信自己的方向正确。但是,我不确定我的脚本能否满足所有要求,特别是在获取合并CAD和合并USD销售数据时。

如果有人能让我重回正轨,那就太好了!

0 个答案:

没有答案