0

I have attempted to build an SQL script in MS SQL Server T-SQL to split a Sales Invoice Revenue measure into 4 measures representing the following:

  • Transaction Sales Revenue = The revenue in the originating currency
  • Home Sales Revenue = The revenue represented in the local division currency (home currency)
  • Consolidated Sales Revenue in CAD = The sales amounts all consolidated into Canadian currency
  • Consolidated Sales Revenue in USD = The sales amounts all consolidated into United States currency

Here is what I've attempted to code in order to satisfy the above requirements:

    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

Here's the sample data from some of the tables: 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           

I believe I am on the right track. However, I am not confident that my script fulfills all requirements particularly when it comes to obtaining the Consolidated CAD and Consolidated USD sales figures.

If anyone can get me back on track, that would be great!

Shawn_M
  • 35
  • 7
  • 1
    We need sample data as _formatted text_ not images please. – Ilyes Oct 18 '18 at 15:26
  • Hi Sami. Thanks. I've also included the sample ASCII formatted data. – Shawn_M Oct 18 '18 at 15:49
  • 1
    Help others help you by posting a **SCRIPT** that creates your tables and your sample data. Otherwise, not many will attempt to reverse-engineer a schema based on code, images, and formatted text. Given the code you did post, things do not look good - all of those conversions are bad, very bad, sign. Use of group by without aggregates is also not a good sign. – SMor Oct 18 '18 at 19:17

0 Answers0