我试图在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销售数据时。
如果有人能让我重回正轨,那就太好了!