s4/InventoryByPlant.sql (235 lines of code) (raw):

WITH LanguageKey AS ( SELECT LanguageKey_SPRAS FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.Languages_T002` WHERE LanguageKey_SPRAS IN UNNEST({{ sap_languages }}) ), CurrencyConversion AS ( SELECT Client_MANDT, FromCurrency_FCURR, ToCurrency_TCURR, ConvDate, ExchangeRate_UKURS FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.CurrencyConversion` WHERE ToCurrency_TCURR IN UNNEST({{ sap_currencies }}) --##CORTEX-CUSTOMER Modify the exchange rate type based on your requirement AND ExchangeRateType_KURST = 'M' ), -- Computing some metrics separately to avoid consuming too many resources in the next step MaterialCostAndPrice AS ( SELECT DISTINCT StockWeeklySnapshots.MaterialNumber_MATNR, StockWeeklySnapshots.Plant_WERKS, StockWeeklySnapshots.WeekEndDate, StockWeeklySnapshots.FiscalYear, StockWeeklySnapshots.FiscalPeriod, -- If StandardCost is null for current week then it picks up the last existing StandardCost COALESCE( MaterialLedger.StandardCost_STPRS, LAST_VALUE(MaterialLedger.StandardCost_STPRS IGNORE NULLS) OVER ( --noqa: disable=L003 PARTITION BY StockWeeklySnapshots.MaterialNumber_MATNR, StockWeeklySnapshots.Plant_WERKS ORDER BY StockWeeklySnapshots.WeekEndDate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )) AS StandardCost_STPRS, -- If MovingAveragePrice is null for current week then it picks up the last -- existing MovingAveragePrice COALESCE( MaterialLedger.MovingAveragePrice, LAST_VALUE(MaterialLedger.MovingAveragePrice IGNORE NULLS) OVER ( PARTITION BY StockWeeklySnapshots.MaterialNumber_MATNR, StockWeeklySnapshots.Plant_WERKS ORDER BY StockWeeklySnapshots.WeekEndDate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )) AS MovingAveragePrice_VERPR FROM --noqa: enable=all `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.StockWeeklySnapshots` AS StockWeeklySnapshots LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.MaterialLedger` AS MaterialLedger ON StockWeeklySnapshots.Client_MANDT = MaterialLedger.Client_MANDT AND StockWeeklySnapshots.MaterialNumber_MATNR = MaterialLedger.MaterialNumber_MATNR AND StockWeeklySnapshots.Plant_WERKS = MaterialLedger.ValuationArea_BWKEY AND StockWeeklySnapshots.FiscalYear = MaterialLedger.FiscalYear AND StockWeeklySnapshots.FiscalPeriod = MaterialLedger.PostingPeriod WHERE MaterialLedger.ValuationType_BWTAR = '' ), CurrentStock AS ( SELECT StockWeeklySnapshots.Client_MANDT, StockWeeklySnapshots.MaterialNumber_MATNR, StockWeeklySnapshots.BatchNumber_CHARG, StockWeeklySnapshots.Plant_WERKS, StockWeeklySnapshots.StorageLocation_LGORT, StorageLocationsMD.StorageLocationText_LGOBE, StockWeeklySnapshots.CompanyCode_BUKRS, StockWeeklySnapshots.CompanyText_BUTXT, StockWeeklySnapshots.BaseUnitOfMeasure_MEINS, StockWeeklySnapshots.CurrencyKey_WAERS, StockWeeklySnapshots.CalYear, StockWeeklySnapshots.CalWeek, StockWeeklySnapshots.FiscalYear, StockWeeklySnapshots.FiscalPeriod, StockWeeklySnapshots.StockCharacteristic, MaterialsBatchMD.DateOfManufacture_HSDAT, MaterialPlantsMD.SafetyStock_EISBE, PlantsMD.Name2_NAME2 AS PlantName_NAME2, PlantsMD.CountryKey_LAND1, PlantsMD.DivisionForIntercompanyBilling_SPART, PlantsMD.ValuationArea_BWKEY, StockWeeklySnapshots.QuantityWeeklyCumulative, StockWeeklySnapshots.AmountWeeklyCumulative, -- If weekend date is in future then it updates with current_date IF( StockWeeklySnapshots.WeekEndDate = LAST_DAY(CURRENT_DATE, WEEK), CURRENT_DATE, StockWeeklySnapshots.WeekEndDate ) AS WeekEndDate, MaterialCostAndPrice.StandardCost_STPRS, MaterialCostAndPrice.MovingAveragePrice_VERPR FROM -- TODO: Evaluate if all columns in StockWeeklySnapshots can be moved into -- MaterialCostAndPrice so we don't need to query the source table twice. `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.StockWeeklySnapshots` AS StockWeeklySnapshots LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.MaterialsBatchMD` AS MaterialsBatchMD ON StockWeeklySnapshots.Client_MANDT = MaterialsBatchMD.Client_MANDT AND StockWeeklySnapshots.MaterialNumber_MATNR = MaterialsBatchMD.MaterialNumber_MATNR AND StockWeeklySnapshots.BatchNumber_CHARG = MaterialsBatchMD.BatchNumber_CHARG LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.MaterialPlantsMD` AS MaterialPlantsMD ON StockWeeklySnapshots.Client_MANDT = MaterialPlantsMD.Client_MANDT AND StockWeeklySnapshots.MaterialNumber_MATNR = MaterialPlantsMD.MaterialNumber_MATNR AND StockWeeklySnapshots.Plant_WERKS = MaterialPlantsMD.Plant_WERKS LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.PlantsMD` AS PlantsMD ON StockWeeklySnapshots.Client_MANDT = PlantsMD.Client_MANDT AND StockWeeklySnapshots.Plant_WERKS = PlantsMD.Plant_WERKS LEFT JOIN MaterialCostAndPrice ON StockWeeklySnapshots.MaterialNumber_MATNR = MaterialCostAndPrice.MaterialNumber_MATNR AND StockWeeklySnapshots.Plant_WERKS = MaterialCostAndPrice.Plant_WERKS AND StockWeeklySnapshots.WeekEndDate = MaterialCostAndPrice.WeekEndDate AND StockWeeklySnapshots.FiscalYear = MaterialCostAndPrice.FiscalYear AND StockWeeklySnapshots.FiscalPeriod = MaterialCostAndPrice.FiscalPeriod LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.StorageLocationsMD` AS StorageLocationsMD ON StockWeeklySnapshots.Client_MANDT = StorageLocationsMD.Client_MANDT AND StockWeeklySnapshots.StorageLocation_LGORT = StorageLocationsMD.StorageLocation_LGORT AND StockWeeklySnapshots.Plant_WERKS = StorageLocationsMD.Plant_WERKS ) SELECT CurrentStock.Client_MANDT, CurrentStock.MaterialNumber_MATNR, CurrentStock.BatchNumber_CHARG, CurrentStock.Plant_WERKS, CurrentStock.StorageLocation_LGORT, CurrentStock.StorageLocationText_LGOBE, CurrentStock.CompanyCode_BUKRS, CurrentStock.CompanyText_BUTXT, CurrentStock.BaseUnitOfMeasure_MEINS, CurrentStock.CurrencyKey_WAERS, CurrentStock.DateOfManufacture_HSDAT, MaterialsMD.MaterialText_MAKTX, LanguageKey.LanguageKey_SPRAS, MaterialsMD.TotalShelfLife_MHDHB, MaterialsMD.MaterialType_MTART, MaterialTypesMD.DescriptionOfMaterialType_MTBEZ, CurrentStock.StandardCost_STPRS, CurrentStock.MovingAveragePrice_VERPR, MaterialsMD.MaterialGroup_MATKL, MaterialGroupsMD.MaterialGroupName_WGBEZ, CurrentStock.SafetyStock_EISBE, CurrentStock.PlantName_NAME2, CurrentStock.CountryKey_LAND1, CurrentStock.DivisionForIntercompanyBilling_SPART, CurrentStock.ValuationArea_BWKEY, CurrentStock.CalYear, CurrentStock.CalWeek, CurrentStock.WeekEndDate, CurrentStock.FiscalYear, CurrentStock.FiscalPeriod, CurrentStock.QuantityWeeklyCumulative, CurrentStock.AmountWeeklyCumulative, CurrentStock.StockCharacteristic, -- The following columns are having amount/prices in target currency. CurrencyConversion.ExchangeRate_UKURS, CurrencyConversion.ToCurrency_TCURR AS TargetCurrency_TCURR, CurrentStock.AmountWeeklyCumulative * CurrencyConversion.ExchangeRate_UKURS AS AmountWeeklyCumulativeInTargetCurrency, CurrentStock.StandardCost_STPRS * CurrencyConversion.ExchangeRate_UKURS AS StandardCostInTargetCurrency_STPRS, CurrentStock.MovingAveragePrice_VERPR * CurrencyConversion.ExchangeRate_UKURS AS MovingAveragePriceInTargetCurrency_VERPR, -- Inventory Value In Target Currency COALESCE( IF( MaterialsMD.MaterialType_MTART IN ('FERT', 'HALB'), CurrentStock.QuantityWeeklyCumulative * (CurrentStock.StandardCost_STPRS * CurrencyConversion.ExchangeRate_UKURS), IF( MaterialsMD.MaterialType_MTART IN ('ROH', 'HIBE'), CurrentStock.QuantityWeeklyCumulative * (CurrentStock.MovingAveragePrice_VERPR * CurrencyConversion.ExchangeRate_UKURS), 0 ) ), 0 ) AS InventoryValueInTargetCurrency, -- Obsolete Inventory Value In Target Currency IF( SAFE.DATE_ADD( CurrentStock.DateOfManufacture_HSDAT, INTERVAL CAST(MaterialsMD.TotalShelfLife_MHDHB AS INT64) DAY ) < CURRENT_DATE, (CurrentStock.AmountWeeklyCumulative * CurrencyConversion.ExchangeRate_UKURS), 0 ) AS ObsoleteInventoryValueInTargetCurrency, -- Inventory Value In Source Currency COALESCE( IF( MaterialsMD.MaterialType_MTART IN ('FERT', 'HALB'), CurrentStock.QuantityWeeklyCumulative * CurrentStock.StandardCost_STPRS, IF( MaterialsMD.MaterialType_MTART IN ('ROH', 'HIBE'), CurrentStock.QuantityWeeklyCumulative * CurrentStock.MovingAveragePrice_VERPR, 0 ) ), 0 ) AS InventoryValueInSourceCurrency, -- ObsoleteStock IF( SAFE.DATE_ADD( CurrentStock.DateOfManufacture_HSDAT, INTERVAL CAST(MaterialsMD.TotalShelfLife_MHDHB AS INT64) DAY ) < CURRENT_DATE, CurrentStock.QuantityWeeklyCumulative, 0 ) AS ObsoleteStock, -- Obsolete Inventory Value In Source Currency IF( SAFE.DATE_ADD( CurrentStock.DateOfManufacture_HSDAT, INTERVAL CAST(MaterialsMD.TotalShelfLife_MHDHB AS INT64) DAY ) < CURRENT_DATE, CurrentStock.AmountWeeklyCumulative, 0 ) AS ObsoleteInventoryValueInSourceCurrency FROM CurrentStock LEFT JOIN CurrencyConversion ON CurrentStock.Client_MANDT = CurrencyConversion.Client_MANDT AND CurrentStock.CurrencyKey_WAERS = CurrencyConversion.FromCurrency_FCURR AND CurrentStock.WeekEndDate = CurrencyConversion.ConvDate CROSS JOIN LanguageKey LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.MaterialsMD` AS MaterialsMD ON CurrentStock.Client_MANDT = MaterialsMD.Client_MANDT AND CurrentStock.MaterialNumber_MATNR = MaterialsMD.MaterialNumber_MATNR AND MaterialsMD.Language_SPRAS = LanguageKey.LanguageKey_SPRAS LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.MaterialTypesMD` AS MaterialTypesMD ON MaterialsMD.Client_MANDT = MaterialTypesMD.Client_MANDT AND MaterialsMD.MaterialType_MTART = MaterialTypesMD.MaterialType_MTART AND MaterialTypesMD.LanguageKey_SPRAS = LanguageKey.LanguageKey_SPRAS LEFT JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.MaterialGroupsMD` AS MaterialGroupsMD ON MaterialsMD.Client_MANDT = MaterialGroupsMD.Client_MANDT AND MaterialsMD.MaterialGroup_MATKL = MaterialGroupsMD.MaterialGroup_MATKL AND MaterialGroupsMD.Language_SPRAS = LanguageKey.LanguageKey_SPRAS