s4/Billing.sql (123 lines of code) (raw):
WITH
AGG_PRCD_ELEMENTS AS (
SELECT
Prcd_Elements.client AS Mandt,
Prcd_Elements.knumv AS Knumv,
Prcd_Elements.kposn AS Kposn,
SUM(IF(Prcd_Elements.koaid = 'C' AND Prcd_Elements.kinak IS NULL, Prcd_Elements.kwert, NULL)) AS Rebate
FROM
`{{ project_id_src }}.{{ dataset_cdc_processed_s4 }}.prcd_elements` AS Prcd_Elements
GROUP BY Mandt, Knumv, Kposn
)
SELECT
VBRK.MANDT AS Client_MANDT,
VBRK.FKART AS BillingType_FKART,
VBRK.FKTYP AS BillingCategory_FKTYP,
VBRK.VKORG AS SalesOrganization_VKORG,
VBRK.VTWEG AS DistributionChannel_VTWEG,
VBRK.SPART AS Division_SPART,
VBRK.VBTYP AS SDDocumentCategory_VBTYP,
VBRK.BZIRK AS SalesDistrict_BZIRK,
VBRK.PLTYP AS PriceListType_PLTYP,
VBRK.FKSTO AS BillingDocumentIsCancelled_FKSTO,
-- VBRK.BLART AS DocumentType_BLART,
-- VBRK.GBSTK AS OverallProcessingStatus_GBSTK,
-- VBRK.BUCHK AS PostingStatusOfBillingDocument_BUCHK,
-- VBRK.RELIK AS InvoiceListStatusOfBillingDocument_RELIK,
-- VBRK.UVALS AS IncompletionStatus_UVALS,
-- VBRK.UVPRS AS PricingIncompletionStatus_UVPRS,
-- VBRK.FKSAK AS BillingStatus_FKSAK,
-- VBRK.ABSTK AS RejectionStatus_ABSTK,
VBRK.KUNRG AS Payer_KUNRG,
VBRK.INCO1 AS IncotermsPart1_INCO1,
VBRK.INCO2 AS IncotermsPart2_INCO2,
VBRK.LAND1 AS DestinationCountry_LAND1,
VBRK.REGIO AS Region_REGIO,
VBRK.COUNC AS CountryCode_COUNC,
VBRK.CITYC AS CityCode_CITYC,
VBRK.TAXK1 AS TaxClassification1ForCustomer_TAXK1,
VBRK.TAXK2 AS TaxClassification2ForCustomer_TAXK2,
VBRK.TAXK3 AS TaxClassification3ForCustomer_TAXK3,
VBRK.TAXK4 AS TaxClassification4ForCustomer_TAXK4,
VBRK.TAXK5 AS TaxClassification5ForCustomer_TAXK5,
VBRK.LANDTX AS TaxDepartureCountry_LANDTX,
VBRK.STCEG_H AS OriginOfSalesTaxIDNumber_STCEG_H,
VBRK.STCEG_L AS CountryOfSalesTaxIDNumber_STCEG_L,
VBRK.XBLNR AS ReferenceDocumentNumber_XBLNR,
VBRK.KONDA AS CustomerPriceGroup_KONDA,
VBRK.RFBSK AS StatusForTransferToAccounting_RFBSK,
VBRK.FKDAT AS BillingDate_FKDAT,
VBRK.GJAHR AS FiscalYear_GJAHR,
VBRK.POPER AS PostingPeriod_POPER,
VBRK.ERDAT AS RecordCreationDate_ERDAT,
VBRK.AEDAT AS LastChangeDate_AEDAT,
VBRK.KDGRP AS CustomerGroup_KDGRP,
VBRK.ZLSCH AS PaymentMethod_ZLSCH,
VBRK.BUKRS AS CompanyCode_BUKRS,
VBRK.MSCHL AS DunningKey_MSCHL,
VBRK.MANSP AS DunningBlock_MANSP,
VBRK.KUNAG AS SoldToParty_KUNAG,
VBRK.FKART_AB AS AccrualBillingType_FKART,
VBRK.BELNR AS AccountingDocumentNumber_BELNR,
VBRK.VSBED AS ShippingConditions_VSBED,
VBRK.WAERK AS SdDocumentCurrency_WAERK,
VBRP.GSBER AS BusinessArea_GSBER,
VBRP.VBELN AS BillingDocument_VBELN,
VBRP.POSNR AS BillingItem_POSNR,
VBRP.PSTYV AS SalesDocumentItemCategory_PSTYV,
VBRP.POSAR AS ItemType_POSAR,
VBRP.KOSTL AS CostCenter_KOSTL,
VBRP.VKGRP AS SalesGroup_VKGRP,
VBRP.VKBUR AS SalesOffice_VKBUR,
VBRP.PRCTR AS ProfitCenter_PRCTR,
VBRP.KOKRS AS ControllingArea_KOKRS,
VBRP.VGTYP AS DocumentCategoryOfPrecedingSDDocument_VGTYP,
VBRP.MATNR AS MaterialNumber_MATNR,
VBRP.PMATN AS PricingReferenceMaterial_PMATN,
VBRP.CHARG AS BatchNumber_CHARG,
VBRP.MATKL AS MaterialGroup_MATKL,
VBRP.PRODH AS ProductHierarchy_PRODH,
VBRP.WERKS AS Plant_WERKS,
VBRP.KONDM AS MaterialPriceGroup_KONDM,
VBRP.LGORT AS StorageLocation_LGORT,
VBRP.EAN11 AS InternationalArticleNumber_EAN11,
VBRP.MVGR1 AS MaterialGroup1_MVGR1,
VBRP.MVGR2 AS MaterialGroup2_MVGR2,
VBRP.MVGR3 AS MaterialGroup3_MVGR3,
VBRP.MVGR4 AS MaterialGroup4_MVGR4,
VBRP.MVGR5 AS MaterialGroup5_MVGR5,
VBRP.SERNR AS BOMExplosionNumber_SERNR,
VBRP.KVGR1 AS CustomerGroup1_KVGR1,
VBRP.KVGR2 AS CustomerGroup2_KVGR2,
VBRP.KVGR3 AS CustomerGroup3_KVGR3,
VBRP.KVGR4 AS CustomerGroup4_KVGR4,
VBRP.KVGR5 AS CustomerGroup5_KVGR5,
VBRP.TXJCD AS TaxJurisdiction_TXJCD,
VBRP.VSTEL AS ShippingPointReceivingPoint_VSTEL,
VBRP.VGBEL AS DocumentNumberOfTheReferenceDocument_VGBEL,
VBRP.VGPOS AS ItemNumberOfTheReferenceItem_VGPOS,
VBRP.AUBEL AS SalesDocument_AUBEL,
VBRP.AUPOS AS SalesDocumentItem_AUPOS,
VBRP.FKIMG AS ActualBilledQuantity_FKIMG,
VBRP.VOLUM AS Volume_VOLUM,
VBRP.BRGEW AS GrossWeight_BRGEW,
VBRP.NTGEW AS NetWeight_NTGEW,
AGG_PRCD_ELEMENTS.KNUMV AS NumberOfTheDocumentCondition_KNUMV,
AGG_PRCD_ELEMENTS.KPOSN AS ConditionItemNumber_KPOSN,
--##CORTEX-CUSTOMER Consider adding other dimensions from the calendar_date_dim table as per your requirement
CalendarDateDimension_FKDAT.CalYear AS YearOfBillingDate_FKDAT,
CalendarDateDimension_FKDAT.CalMonth AS MonthOfBillingDate_FKDAT,
CalendarDateDimension_FKDAT.CalWeek AS WeekOfBillingDate_FKDAT,
CalendarDateDimension_FKDAT.CalQuarter AS DayOfBillingDate_FKDAT,
-- ##CORTEX-CUSTOMER If you prefer to use currency conversion, uncomment below
-- currency_conversion.UKURS AS ExchangeRate_UKURS,
-- currency_conversion.conv_date AS Conversion_date,
-- currency_conversion.TCURR AS TargetCurrency_TCURR,
-- COALESCE(VBRP.NETWR * currency_decimal.CURRFIX, VBRP.NETWR) * currency_conversion.UKURS AS NetValueInTargetCurrency_NETWR,
-- COALESCE(VBRK.MWSBK * currency_decimal.CURRFIX, VBRK.MWSBK) * currency_conversion.UKURS AS TaxAmountInTargetCurrency_MWSBK,
-- COALESCE(VBRP.MWSBP * currency_decimal.CURRFIX, VBRP.MWSBP) * currency_conversion.UKURS AS TaxAmountPosInTargetCurrency_MWSBP,
-- COALESCE(AGG_PRCD_ELEMENTS.rebate * currency_decimal.CURRFIX, AGG_PRCD_ELEMENTS.rebate) * currency_conversion.UKURS AS RebateInTargetCurrency,
COALESCE(VBRP.NETWR * currency_decimal.CURRFIX, VBRP.NETWR) AS NetValue_NETWR,
COALESCE(VBRK.MWSBK * currency_decimal.CURRFIX, VBRK.MWSBK) AS TaxAmount_MWSBK,
COALESCE(VBRP.MWSBP * currency_decimal.CURRFIX, VBRP.MWSBP) AS TaxAmountPos_MWSBP,
COALESCE(AGG_PRCD_ELEMENTS.rebate * currency_decimal.CURRFIX, AGG_PRCD_ELEMENTS.rebate) AS Rebate,
COUNT(VBRK.VBELN) OVER (PARTITION BY CalendarDateDimension_FKDAT.CalYear) AS YearOrderCount,
COUNT(VBRK.VBELN) OVER (PARTITION BY CalendarDateDimension_FKDAT.CalYear, CalendarDateDimension_FKDAT.CalMonth) AS MonthOrderCount,
COUNT(VBRK.VBELN) OVER (PARTITION BY CalendarDateDimension_FKDAT.CalYear, CalendarDateDimension_FKDAT.CalMonth, CalendarDateDimension_FKDAT.CalWeek) AS WeekOrderCount
FROM `{{ project_id_src }}.{{ dataset_cdc_processed_s4 }}.vbrk` AS VBRK
INNER JOIN `{{ project_id_src }}.{{ dataset_cdc_processed_s4 }}.vbrp` AS VBRP
ON
VBRK.VBELN = VBRP.VBELN
AND VBRK.MANDT = VBRP.MANDT
INNER JOIN AGG_PRCD_ELEMENTS
ON
AGG_PRCD_ELEMENTS.MANDT = vbrk.MANDT
AND CAST(AGG_PRCD_ELEMENTS.Knumv AS STRING) = vbrk.knumv
AND CAST(AGG_PRCD_ELEMENTS.Kposn AS STRING) = vbrp.posnr
LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.currency_decimal` AS currency_decimal
ON vbrk.WAERK = currency_decimal.CURRKEY
-- ##CORTEX-CUSTOMER If you prefer to use currency conversion, uncomment below
-- LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.currency_conversion` AS currency_conversion
-- ON VBRK.MANDT = currency_conversion.MANDT
-- AND VBRK.WAERK = currency_conversion.FCURR
-- AND VBRK.FKDAT = currency_conversion.conv_date
-- AND currency_conversion.TCURR IN UNNEST({{ sap_currencies }})
-- ##CORTEX-CUSTOMER Modify the exchange rate type based on your requirement
-- AND currency_conversion.KURST = 'M'
LEFT JOIN `{{ project_id_src }}.{{ k9_datasets_processing }}.calendar_date_dim` AS CalendarDateDimension_FKDAT
ON CalendarDateDimension_FKDAT.Date = VBRK.FKDAT