SCM POC · Data model

ER diagram & data dictionary

Signify Americas Consumer supply-chain pipeline · RAW → RAW_TRUSTED → STAGING → CURATED → AGGREGATE → SEMANTIC

Pipeline Overview

Six layers, each a Snowflake schema under database SCM_POC. Every layer below is documented with every table, every column, its data type, and its business meaning — verified live against INFORMATION_SCHEMA, not inferred from documentation that may be stale.

12
RAW tables
12
RAW_TRUSTED tables
9
STAGING tables
23
CURATED tables
13
AGGREGATE tables
4
SEMANTIC views
What each layer is for
RAW — one table per source extract, every column loaded as text, no transformation.
RAW_TRUSTED — same grain as RAW, but every value is type-cast (dates → DATE, measures → NUMBER/FLOAT) and blank/placeholder tokens are normalized to true NULL.
STAGING — one cleaned, business-rule-applied table per business concept (demand, delivery, purchasing, inventory, slow-moving, material master, planning parameters), with material/plant codes standardized to their canonical form.
CURATED — the conformed star schema: dimensions, bridges, and facts, with real primary/foreign keys, ready for direct business consumption.
AGGREGATE — pre-joined, pre-computed KPI tables built on top of CURATED, for reporting and fast query response.
SEMANTIC — the four Cortex Analyst semantic views (v2 generation) that the SCM_AGENT_WITH_RECS SCM Assistant Agent actually queries.
The one key that ties everything together
MATERIAL_12NC — Signify's 14-digit product code — is the conformed join key shared across every fact and dimension table from STAGING onward. PLANT_CODE (6-character SAP plant code) is the second universal key.

Scope of this document
Only the six schemas above. Legacy/deprecated schemas (SCM_SCHEMA, SCM_BRONZE, and the *_BACKUP_* clone schemas) are intentionally out of scope — they are not part of the live, current pipeline.
Note on RAW and RAW_TRUSTED depth: these two layers together carry roughly 2,750 columns, the great majority of which are unpopulated legacy SAP/BW fields (customer-extension ZZ* fields, unused industry-solution fields such as SAP Retail/Fashion/Healthcare add-ons, and internal SAP configuration codes with no reliable business meaning). To keep this document useful rather than exhaustive-for-its-own-sake, the RAW and RAW_TRUSTED sections document every table's purpose and every column that is actually populated and used downstream, and summarize the large unpopulated/cryptic tail compactly rather than listing each one. STAGING, CURATED, AGGREGATE, and SEMANTIC — the layers with real business logic — are documented in full, column by column.

ER Diagram

Two views: a table-level lineage flow across all six layers, and a detailed relational (star-schema) diagram of the CURATED layer, the layer with real primary/foreign key constraints.

1. Table-Level Flow Across the Six Layers

Every table in one layer is rebuilt from tables in the layer immediately to its left. No layer reads more than one hop upstream (e.g. AGGREGATE reads only CURATED, never STAGING directly). The two universal join keys — MATERIAL_12NC and PLANT_CODE — become standardized starting at STAGING and are used consistently through SEMANTIC.

RAW
12
Untyped text landing tables
DEMAND_QXP_AMS_CONS
DRM_AMS_CONS
PO_LT_DATA_US
RAW_TRUSTED
12
Typed 1:1 mirror of RAW
Same 12 tables,
typed + NULL-normalized
STAGING
9
Business-rule-applied, ID-standardized
STG_DEMAND_FORECAST
STG_DRM · STG_PO
STG_INVENTORY · …
CURATED
23
Conformed star schema
8 dims/bridges
15 facts/derived tables
AGGREGATE
13
Pre-joined KPI tables
Forecast, delivery,
vendor, risk scorecards
SEMANTIC
4
Cortex Analyst views (v2)
Purchasing · Delivery
Demand Planning · Inventory

2. CURATED Layer — Relational (Star Schema) Diagram

CURATED is the only layer with enforced primary/foreign-key relationships (declared as NOT ENFORCED constraints — Snowflake records the relationship for documentation and query-optimization purposes but does not reject violating rows at write time). Dimensions and bridges below; every fact/derived table's foreign keys are shown as chips, with the full relationship list in the table beneath for precise reference.

DimensionBridgeForeign key reference
DIM_MATERIAL
PK: MATERIAL_12NC
DIM_PLANT
PK: PLANT_CODE
DIM_SUPPLIER_SOURCE
PK: SUPPLIER_SK
DIM_CUSTOMER
PK: CUSTOMER_ID
DIM_BUSINESS_UNIT
PK: BU_ID (BG×BU×MAG)
DIM_BUSINESS_UNIT_BYCODE
Key: BU_CODE (view over DIM_BUSINESS_UNIT, unique per BU)
DIM_DELAY_REASON
PK: REASON_CODE
DIM_FISCAL_PERIOD
PK: FISCAL_PERIOD_CODE
BRIDGE_MATERIAL_PLANT
PK: (MATERIAL_12NC, PLANT_CODE)
BRIDGE_SUPPLIER_MATERIAL
PK: (SUPPLIER_SK, MATERIAL_12NC, PLANT_CODE)
BRIDGE_SUPPLIER_ENTERPRISE_MAPPING
Maps source-specific SUPPLIER_SK to an enterprise supplier ID
FACT_INVENTORY
PK: INVENTORY_SK
→ DIM_MATERIAL→ DIM_PLANT→ DIM_FISCAL_PERIOD
FACT_DEMAND_FORECAST
PK: DEMAND_SK
→ DIM_MATERIAL→ DIM_PLANT→ DIM_FISCAL_PERIOD
FACT_FORECAST_PERFORMANCE
PK: FCST_PERF_SK
→ DIM_MATERIAL→ DIM_FISCAL_PERIOD
FACT_PURCHASE_ORDER_LINE
PK: PO_SK
→ DIM_MATERIAL→ DIM_PLANT→ DIM_SUPPLIER_SOURCE
FACT_PO_SCHEDULE
PK: PO_SCHEDULE_SK
→ FACT_PURCHASE_ORDER_LINE→ DIM_MATERIAL→ DIM_PLANT→ DIM_SUPPLIER_SOURCE
FACT_PO_CONFIRMATION
PK: PO_CONFIRM_SK
→ FACT_PURCHASE_ORDER_LINE→ DIM_MATERIAL→ DIM_PLANT→ DIM_SUPPLIER_SOURCE
FACT_GOODS_MOVEMENT
PK: GOODS_MOVEMENT_SK
→ FACT_PURCHASE_ORDER_LINE→ DIM_MATERIAL→ DIM_PLANT
FACT_INBOUND_SUPPLY_EVENT
PK: INBOUND_EVENT_SK
→ FACT_PURCHASE_ORDER_LINE→ DIM_MATERIAL→ DIM_PLANT→ DIM_SUPPLIER_SOURCE
FACT_SALES_ORDER_LINE
PK: SO_SK
→ DIM_MATERIAL→ DIM_PLANT→ DIM_CUSTOMER→ DIM_BUSINESS_UNIT→ DIM_BUSINESS_UNIT_BYCODE
FACT_DELIVERY
PK: DELIVERY_SK
→ FACT_SALES_ORDER_LINE→ DIM_MATERIAL→ DIM_PLANT→ DIM_CUSTOMER→ DIM_BUSINESS_UNIT→ DIM_BUSINESS_UNIT_BYCODE
FACT_SLOW_MOVING_INVENTORY
PK: SMI_SK
→ DIM_MATERIAL→ DIM_PLANT→ DIM_FISCAL_PERIOD→ DIM_BUSINESS_UNIT→ DIM_BUSINESS_UNIT_BYCODE
SUPPLY_POSITION_BY_DATE
PK: (MATERIAL_12NC, PLANT_CODE, POSITION_DATE)
→ DIM_MATERIAL→ DIM_PLANT
SUPPLY_ORDER_IMPACT
PK: SO_SK
→ FACT_SALES_ORDER_LINE→ DIM_MATERIAL→ DIM_PLANT→ DIM_CUSTOMER→ DIM_BUSINESS_UNIT_BYCODE→ DIM_DELAY_REASON

Not shown above: DIM_FISCAL_PERIOD, DIM_CUSTOMER, and the bridges are dimension-side reference tables with no outbound foreign keys of their own. FACT_INVENTORY is not directly linked to FACT_DEMAND_FORECAST or FACT_PURCHASE_ORDER_LINE in CURATED — those cross-domain joins happen downstream in AGGREGATE (e.g. AGG_SUPPLY_HEALTH_MATERIAL_PLANT_MONTHLY), not here.

Full Foreign-Key Reference (CURATED)

TableFK Column(s)ReferencesNotes
BRIDGE_MATERIAL_PLANTMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
BRIDGE_MATERIAL_PLANTPLANT_CODEDIM_PLANTPLANT_CODE
BRIDGE_SUPPLIER_MATERIALSUPPLIER_SKDIM_SUPPLIER_SOURCESUPPLIER_SK
BRIDGE_SUPPLIER_MATERIALMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
BRIDGE_SUPPLIER_ENTERPRISE_MAPPINGSUPPLIER_SKDIM_SUPPLIER_SOURCESUPPLIER_SK
FACT_INVENTORYMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
FACT_INVENTORYPLANT_CODEDIM_PLANTPLANT_CODE
FACT_INVENTORYFISCAL_PERIOD_CODEDIM_FISCAL_PERIODFISCAL_PERIOD_CODE
FACT_DEMAND_FORECASTMATERIAL_12NCDIM_MATERIALMATERIAL_12NC (may be a planning aggregate key — check IS_AGGREGATE_KEY)
FACT_DEMAND_FORECASTPLANT_CODEDIM_PLANTPLANT_CODE
FACT_DEMAND_FORECASTCALENDAR_MONTH_KEY / FISCAL_PERIOD_CODEDIM_FISCAL_PERIODCALENDAR_MONTH_KEY / FISCAL_PERIOD_CODE
FACT_FORECAST_PERFORMANCEMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
FACT_FORECAST_PERFORMANCEFISCAL_PERIOD_CODEDIM_FISCAL_PERIODFISCAL_PERIOD_CODE
FACT_PURCHASE_ORDER_LINEMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
FACT_PURCHASE_ORDER_LINEPLANT_CODEDIM_PLANTPLANT_CODE (receiving plant)
FACT_PURCHASE_ORDER_LINESUPPLIER_SKDIM_SUPPLIER_SOURCESUPPLIER_SK (DC vendor — the actual PO counterparty)
FACT_PO_SCHEDULEPO_SKFACT_PURCHASE_ORDER_LINEPO_SK
FACT_PO_SCHEDULEMATERIAL_12NC / PLANT_CODE / SUPPLIER_SKDIM_MATERIAL / DIM_PLANT / DIM_SUPPLIER_SOURCEresolved via FACT_PURCHASE_ORDER_LINE (EKET carries no material column itself)
FACT_PO_CONFIRMATIONPO_SK (implied)FACT_PURCHASE_ORDER_LINEPO_SK
FACT_PO_CONFIRMATIONMATERIAL_12NC / PLANT_CODE / SUPPLIER_SKDIM_MATERIAL / DIM_PLANT / DIM_SUPPLIER_SOURCEresolved via FACT_PURCHASE_ORDER_LINE
FACT_GOODS_MOVEMENTPO_SKFACT_PURCHASE_ORDER_LINEPO_SK
FACT_GOODS_MOVEMENTMATERIAL_12NC / PLANT_CODEDIM_MATERIAL / DIM_PLANTresolved via FACT_PURCHASE_ORDER_LINE
FACT_INBOUND_SUPPLY_EVENTMATERIAL_12NC / PLANT_CODE / SUPPLIER_SKDIM_MATERIAL / DIM_PLANT / DIM_SUPPLIER_SOURCEresolved via FACT_PURCHASE_ORDER_LINE
FACT_SALES_ORDER_LINEMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
FACT_SALES_ORDER_LINEPLANT_CODEDIM_PLANTPLANT_CODE (fulfilling plant)
FACT_SALES_ORDER_LINECUSTOMER_IDDIM_CUSTOMERCUSTOMER_ID (ship-to)
FACT_SALES_ORDER_LINESOLD_TO_IDDIM_CUSTOMERCUSTOMER_ID (sold-to / billing party)
FACT_SALES_ORDER_LINEBU_CODE / BG_KEYDIM_BUSINESS_UNIT_BYCODE / DIM_BUSINESS_UNITBU_CODE / BG_KEY
FACT_DELIVERYSO_SKFACT_SALES_ORDER_LINESO_SK
FACT_DELIVERYMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
FACT_DELIVERYPLANT_CODEDIM_PLANTPLANT_CODE (fulfilling plant)
FACT_DELIVERYCUSTOMER_IDDIM_CUSTOMERCUSTOMER_ID (ship-to — physical recipient)
FACT_DELIVERYSOLD_TO_IDDIM_CUSTOMERCUSTOMER_ID (sold-to — ordering/billing party)
FACT_DELIVERYBU_CODE / BG_KEYDIM_BUSINESS_UNIT_BYCODE / DIM_BUSINESS_UNITBU_CODE / BG_KEY
FACT_SLOW_MOVING_INVENTORYMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
FACT_SLOW_MOVING_INVENTORYPLANT_CODEDIM_PLANTPLANT_CODE
FACT_SLOW_MOVING_INVENTORYFISCAL_PERIOD_CODEDIM_FISCAL_PERIODFISCAL_PERIOD_CODE
FACT_SLOW_MOVING_INVENTORYBG_CODE / BU_CODEDIM_BUSINESS_UNIT / DIM_BUSINESS_UNIT_BYCODEBG_KEY / BU_CODE
SUPPLY_POSITION_BY_DATEMATERIAL_12NCDIM_MATERIALMATERIAL_12NC
SUPPLY_POSITION_BY_DATEPLANT_CODEDIM_PLANTPLANT_CODE
SUPPLY_ORDER_IMPACTSO_SKFACT_SALES_ORDER_LINESO_SK
SUPPLY_ORDER_IMPACTMATERIAL_12NC / PLANT_CODEDIM_MATERIAL / DIM_PLANTMATERIAL_12NC / PLANT_CODE
SUPPLY_ORDER_IMPACTCUSTOMER_IDDIM_CUSTOMERCUSTOMER_ID
SUPPLY_ORDER_IMPACTBU_CODEDIM_BUSINESS_UNIT_BYCODEBU_CODE
SUPPLY_ORDER_IMPACTPRIMARY_DELAY_REASONDIM_DELAY_REASONREASON_CODE (NULL for on-time deliveries)

RAWRaw Landing Tables

One table per source extract. Every column is loaded as text with no transformation — this layer exists purely to land the source data untouched before any cleansing happens.

DEMAND_QXP_AMS_CONS — 47 columns (all TEXT), 105,333 rows

Row count (live): 105,333
Total columns: 47 (all TEXT, no transformation applied)

The initial full-width landing tier for the monthly demand-planning (QxP) key-figure extract: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

SALES_AMS_CONS_VIPP — 46 columns (all TEXT), 243,827 rows

Row count (live): 243,827
Total columns: 46 (all TEXT, no transformation applied)

The initial full-width landing tier for the monthly sales-actuals key-figure extract: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

DRM_AMS_CONS — 233 columns (all TEXT), 756,429 rows

Row count (live): 756,429
Total columns: 233 (all TEXT, no transformation applied)

The initial full-width landing tier for the Delivery Reliability Measure (DRM) extract: every source column preserved as text, no transformation applied. The largest RAW table by both row and column count. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

EKBE_DATA_PO — 90 columns (all TEXT), 38,520 rows

Row count (live): 38,520
Total columns: 90 (all TEXT, no transformation applied)

The initial full-width landing tier for the SAP EKBE goods-movement history: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

EKES_DATA_PO — 35 columns (all TEXT), 20,725 rows

Row count (live): 20,725
Total columns: 35 (all TEXT, no transformation applied)

The initial full-width landing tier for the SAP EKES vendor order confirmations: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

EKET_DATA_PO — 78 columns (all TEXT), 12,073 rows

Row count (live): 12,073
Total columns: 78 (all TEXT, no transformation applied)

The initial full-width landing tier for the SAP EKET purchase-order schedule lines: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

FC_BIAS_FACC — 88 columns (all TEXT), 66,121 rows

Row count (live): 66,121
Total columns: 88 (all TEXT, no transformation applied)

The initial full-width landing tier for the forecast-bias snapshot extract: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

INVENTORY_AMS_CONS — 72 columns (all TEXT), 2,072,627 rows

Row count (live): 2,072,627
Total columns: 72 (all TEXT, no transformation applied)

The initial full-width landing tier for the batch-grain inventory snapshot: every source column preserved as text, no transformation applied. The largest RAW table by row count. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

MARC_AMS_CONSUMER — 277 columns (all TEXT), 56,060 rows

Row count (live): 56,060
Total columns: 277 (all TEXT, no transformation applied)

The initial full-width landing tier for the SAP MARC material-planning master: every source column preserved as text, no transformation applied. The widest RAW table by column count. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

PO_LT_DATA_US — 131 columns (all TEXT), 12,072 rows

Row count (live): 12,072
Total columns: 131 (all TEXT, no transformation applied)

The initial full-width landing tier for the purchase-order lead-time bridge extract: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

SLOWMO_AMS_CONS — 99 columns (all TEXT), 124,287 rows

Row count (live): 124,287
Total columns: 99 (all TEXT, no transformation applied)

The initial full-width landing tier for the slow-moving/dead-stock inventory extract: every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

T_MD_MATERIAL_CONSUMER — 180 columns (all TEXT), 536,076 rows

Row count (live): 536,076
Total columns: 180 (all TEXT, no transformation applied)

The initial full-width landing tier for the SAP BW material master (BIC_* enriched attributes): every source column preserved as text, no transformation applied. See the RAW_TRUSTED section for the typed, documented version of this table's meaningful columns.

RAW_TRUSTEDTyped & Cleaned Landing Tables

Same grain as RAW, one table per source extract, but every value is type-cast to its real data type and blank/placeholder tokens are normalized to true NULL. No business logic is applied yet.

DEMAND_QXP_AMS_CONS — 20 of 47 columns shown, 105,333 rows

Row count (live): 105,333
Total columns: 47

Monthly demand-planning (QxP) key-figure extract — one row per material/plant/period/key-figure/category slice. Unioned with SALES_AMS_CONS_VIPP into STAGING.STG_DEMAND_FORECAST as the pipeline's forecast-vs-actual base.

ColumnTypeBusiness Meaning
_12NCVARCHARMaterial 12NC, already canonical in this table — join key to DIM_MATERIAL.
PLANT_NBVARCHAR6-char canonical plant code — join key to DIM_PLANT.
FISCAL_PERIODDATEFiscal period, converted downstream to a YYYY-MM-01 calendar month key.
KFVARCHARKey-figure code (e.g. ACT_CY, QxP EUR) — classified downstream into QUANTITY vs VALUE_EUR.
CATEGORYVARCHARDistinguishes current-year vs prior-year sales slices — the ACT_CY/ACT_CY-1 labels live here, not in KF.
VALUENUMBERThe measure amount — routed to forecast_quantity or forecast_value_eur based on KF/CURRENCY.
CURRENCYVARCHARPopulated only for monetary key figures; blank implies a quantity measure.
DISTRIBUTION_CHANNELVARCHAR2-char channel code; STAGING keeps only '01' (Consumer) per client scope.
FIN_POST_INDVARCHARFinance posting indicator; STAGING keeps only '#' (default/no-allocation) per client scope.
COMMERCIAL_SUB_TEAMVARCHARGenuinely-distinct source slice, included in STAGING's dedup partition key.
PGORUVARCHARORU org key.
PGMRUVARCHARMRU org key.
BGVARCHARBusiness group code, raw 'BU0118'-style prefix, cleaned to numeric bg_code downstream.
BUVARCHARBusiness unit code, same cleanup as BG.
CHANNEL_GROUPVARCHARChannel grouping attribute.
APO_PLANN_ACC_NBVARCHARPlanning account — join key to DRM's APO_PLANNING_ACCOUNT.
MRP_CONTROLLERVARCHARReporting-source MRP controller code.
FIRST_IN_CHAIN_MANUFACTURER_KEYVARCHARManufacturer key, passed through to STAGING.
PRODUCT_LIFE_CYCLE_PHASEVARCHARLifecycle phase attribute.
LAST_UPDATE_DTTMTIMESTAMPSource revision timestamp — keeps only the latest revision per business key.
The remaining ~27 columns are largely unused legacy SAP/BW fields (secondary hierarchy codes, alternate UOM/currency conversion fields, internal APO routing flags) not consumed by any downstream transformation. FIRST_IN_CHAIN_MANUFACTURER_NAME, ATO_ETO, SUPPLY_CLASS and SEGMENT are also passed through to STAGING but omitted above for brevity.
SALES_AMS_CONS_VIPP — 20 of 46 columns shown, 243,827 rows

Row count (live): 243,827
Total columns: 46

Monthly sales-actuals key-figure extract, structurally near-identical to DEMAND_QXP_AMS_CONS (46 vs 47 columns — one fewer legacy field). Fully unioned into the same STG_DEMAND_FORECAST target as the actuals half of the forecast-vs-actual base.

ColumnTypeBusiness Meaning
_12NCVARCHARMaterial 12NC, already canonical — join key to DIM_MATERIAL.
PLANT_NBVARCHAR6-char canonical plant code — join key to DIM_PLANT.
FISCAL_PERIODDATEFiscal period, converted downstream to a YYYY-MM-01 calendar month key.
KFVARCHARKey-figure code — classified downstream into QUANTITY vs VALUE_EUR, same rules as DEMAND_QXP.
CATEGORYVARCHARDistinguishes current-year vs prior-year sales slices.
VALUENUMBERThe measure amount — routed to forecast_quantity or forecast_value_eur.
CURRENCYVARCHARPopulated only for monetary key figures.
DISTRIBUTION_CHANNELVARCHAR2-char channel code; STAGING keeps only '01' (Consumer).
FIN_POST_INDVARCHARFinance posting indicator; STAGING keeps only '#'.
COMMERCIAL_SUB_TEAMVARCHARGenuinely-distinct source slice, included in STAGING's dedup partition key.
PGORUVARCHARORU org key.
PGMRUVARCHARMRU org key.
BGVARCHARBusiness group code — carries the same raw-prefix conformance issue as DEMAND_QXP.BG.
BUVARCHARBusiness unit code, same cleanup as BG.
CHANNEL_GROUPVARCHARChannel grouping attribute.
APO_PLANN_ACC_NBVARCHARPlanning account.
MRP_CONTROLLERVARCHARReporting-source MRP controller code.
PRODUCT_LIFE_CYCLE_PHASEVARCHARLifecycle phase attribute.
SUPPLY_CLASSVARCHARSupply classification attribute.
LAST_UPDATE_DTTMTIMESTAMPSource revision timestamp — keeps only the latest revision per business key (2,978 groups have multiple revisions live).
The remaining ~26 columns are unused legacy SAP/BW fields, the same categories as DEMAND_QXP_AMS_CONS's unused remainder (secondary hierarchy codes, alternate UOM/currency fields, internal routing flags).
DRM_AMS_CONS — 21 of 233 columns shown, 756,429 rows

Row count (live): 756,429
Total columns: 233

Delivery Reliability Measure (DRM) extract — one row per sales-order/delivery line, carrying on-time/complete-delivery scoring, root-cause miss flags, and dates across the supply→sales→outbound chain. The largest table by row count and the most heavily consumed by STAGING.STG_DRM.

ColumnTypeBusiness Meaning
MATERIALVARCHARMaterial 12NC, already canonical — join key to DIM_MATERIAL.
PLANTVARCHAR6-char canonical plant code.
DOC_NUMBERVARCHARSales order number.
S_ORD_ITEMVARCHARSales order item.
DELIV_NUMBVARCHARDelivery number.
DELIV_ITEMVARCHARDelivery item.
MRP_CONTRLVARCHARReporting-source MRP controller code.
SHIP_TOVARCHARShip-to party ID.
SOLD_TOVARCHARSold-to party ID.
EXTERNAL_SUPPLIERVARCHARSupplier ID (LIFNR or other format).
TGT_AGREED_DP_DATEDATEAgreed delivery-promise date — anchors on-time scoring and overdue detection.
ACTUAL_DELIVERY_DATEDATEActual delivery date; NULL + an already-passed agreed date is scored as a miss, not excluded.
ACTUAL_GOODS_ISSUE_DATEDATEActual goods-issue date.
ACTUAL_QTY_DE_SIUMNUMBERActual delivered quantity.
AGREED_DEL_PROMISE_ORDER_LINE_QTY_SIUMNUMBERAgreed order-line quantity — paired with actual for the completeness check.
DRM_TOTAL_LINESNUMBEREligibility counter feeding the DRM miss-rate denominator.
DRM_SCORED_LINESNUMBERSuccessful-outcome counter feeding the DRM miss-rate numerator.
ITEM_CATEGVARCHARItem category; only '10ZE01' (standard delivery, ~96% of rows) enters DRM/OTIF scoring.
ADP_DAYS_DEVVARCHARDelay in days vs the agreed date; literal '?' marks an unmeasurable line (excluded from scoring).
REASON_FOR_REJECTIONVARCHARRejection/cancellation reason code — excludes the line from the DRM denominator when populated.
COMPL_DELVARCHARDelivery-completeness requirement indicator (a configuration flag, not proof of actual fulfillment).
Roughly 45 further MISSED_* granular miss-tier flag columns (supply/sales/outbound block reasons) and their matching *_TXT description fields are also consumed by STAGING, but are rolled up there into two derived fields (primary_delay_reason, delay_reason_group) rather than documented individually here. The remaining ~165 columns are unused legacy SAP BW fields (secondary routing/hierarchy codes, alternate date stamps, internal scoring diagnostics).
EKBE_DATA_PO — 11 of 90 columns shown, 38,520 rows

Row count (live): 38,520
Total columns: 90

Goods-movement history (SAP EKBE) — one row per PO/item/movement posting. Deduplicated and aggregated in STAGING to net received quantity and last goods-receipt date per PO line.

ColumnTypeBusiness Meaning
EBELNVARCHARPO number — join key.
EBELPVARCHARPO item — join key.
BELNRVARCHARMaterial document number, part of the dedup key.
GJAHRVARCHARMaterial document fiscal year, part of the dedup key.
BUZEIVARCHARDocument line item, part of the dedup key.
VGABEVARCHARTransaction/event type, part of the dedup key.
BWARTVARCHARMovement type — filtered to 101/102/107/108/161/162 (goods receipt, reversals, returns).
SHKZGVARCHARDebit/credit indicator (S=receipt, H=return) — determines the sign of received_qty_net.
MENGENUMBERMovement quantity — summed (signed by SHKZG) into received_qty_net.
BUDATDATEPosting date — MAX() gives last_gr_date.
GLCHANGETIMETIMESTAMPLast-change timestamp — the dedup tiebreak (latest change wins).
The remaining 79 columns are unused legacy SAP MM document fields (accounting document line detail, tax codes, internal clearing references) not consumed by any downstream transformation.
EKES_DATA_PO — 7 of 35 columns shown, 20,725 rows

Row count (live): 20,725
Total columns: 35

Vendor order confirmations (SAP EKES) — vendor-confirmed delivery dates for scheduling-agreement POs. Deduplicated and aggregated in STAGING to earliest open-quantity confirmed date and total confirmed quantity per PO line.

ColumnTypeBusiness Meaning
EBELNVARCHARPO number — join key (matches the DC-PO number, not the EP-PO number, 100% live).
EBELPVARCHARPO item — join key.
ETENSVARCHARConfirmation sequence number, part of the dedup key.
MENGENUMBERConfirmed quantity.
DABMGNUMBERQuantity already delivered against this confirmation — MENGE-DABMG>0 identifies still-open confirmations.
EINDTDATEConfirmed delivery date — MIN() over open confirmations gives earliest_confirmed_date.
GLCHANGETIMETIMESTAMPLast-change timestamp — the dedup tiebreak.
The remaining 28 columns are unused legacy SAP EKES fields (confirmation category codes, control indicators, alternate quantity units).
EKET_DATA_PO — 7 of 78 columns shown, 12,073 rows

Row count (live): 12,073
Total columns: 78

Purchase-order schedule lines (SAP EKET) — planned delivery schedule for standard POs. Deduplicated and aggregated in STAGING to earliest open-quantity schedule date and total scheduled quantity per PO line.

ColumnTypeBusiness Meaning
EBELNVARCHARPO number — join key.
EBELPVARCHARPO item — join key.
ETENRVARCHARSchedule line number, part of the dedup key.
MENGENUMBERScheduled quantity — summed into scheduled_qty.
WEMNGNUMBERQuantity already received against this schedule line — MENGE-WEMNG>0 identifies still-open lines.
EINDTDATEScheduled delivery date — MIN() over open lines gives earliest_schedule_date.
GLCHANGETIMETIMESTAMPLast-change timestamp — the dedup tiebreak.
The remaining 71 columns are unused legacy SAP EKET fields (confirmation control keys, statistics-relevant flags, alternate date types).
FC_BIAS_FACC — 19 of 88 columns shown, 66,121 rows

Row count (live): 66,121
Total columns: 88

Forecast-bias snapshot — planned quantity/QxP and absolute-deviation figures captured at four snapshot horizons (N-3 through N) per material/planning-account/distribution-channel/fiscal-period. Only the Consumer channel ('1001') is in scope for STAGING.STG_FORECAST_BIAS.

ColumnTypeBusiness Meaning
MATERIALVARCHARMaterial 12NC.
APO_PLANN_ACCCODEVARCHARPlanning account.
DISTRIBUTION_CHANNELVARCHAR4-digit form ('1001', unlike DEMAND/SALES' 2-char '01'); STAGING filters to Consumer only.
DISTR_CHANNEL_TXTVARCHARChannel description.
APO_SCM_AREA_CODE_MXVARCHARCountry-level SCM area code — cannot join to plant-grain tables directly.
FISCPERVARCHARYYYYPPP fiscal period, resolved to calendar month via DIM_FISCAL_PERIOD.
BGVARCHARBusiness group code.
BUVARCHARBusiness unit code.
MAGVARCHARMAG code.
CAGVARCHARCAG code.
CF_PLANNED_QTY_SNAPSHOT_N3NUMBERPlanned quantity captured 3 periods before the reporting period.
CF_PLANNED_QTY_SNAPSHOT_NNUMBERPlanned quantity captured at the reporting period itself.
ACTUAL_DP_DEL_QTY_CORRECTEDNUMBERActual delivered quantity.
ABS_DEV_N_3_CALCVALUENUMBERAbsolute deviation at the N-3 snapshot horizon.
ABS_DEV_N_0_CALCVALUENUMBERAbsolute deviation at the N (current) snapshot horizon.
CF_PLANNED_QXP_SNAPSHOT_N3NUMBERPlanned QxP (EUR) at the N-3 snapshot horizon.
CF_PLANNED_QXP_SNAPSHOT_NNUMBERPlanned QxP (EUR) at the N snapshot horizon.
CF_ABS_DEV_SNAPSHOT_N3NUMBERCF absolute deviation at the N-3 snapshot horizon.
CF_ABS_DEV_SNAPSHOT_NNUMBERCF absolute deviation at the N snapshot horizon.
The N-2/N-1 snapshot variants of each of the four planned-qty/QxP/deviation families follow the identical pattern shown above for N-3/N (12 more columns, all consumed the same way). The remaining ~57 columns are unused legacy forecast-bias diagnostic fields.
INVENTORY_AMS_CONS — 13 of 72 columns shown, 2,072,627 rows

Row count (live): 2,072,627
Total columns: 72

Batch-grain inventory snapshot — one row per material/plant/storage-location/stock-type/batch/period. The largest table by row count. STAGING aggregates away the batch dimension into STG_INVENTORY at material+plant+storage_location+stock_type+period grain.

ColumnTypeBusiness Meaning
MATERIALVARCHARMaterial 12NC.
PLANTVARCHARPlant code.
STORAGE_LOCATIONVARCHARStorage location — kept, not collapsed, per capability-map requirement.
STOCK_TYPEVARCHARSAP stock type code (A/Q/D/other) — decoded downstream to Unrestricted/Quality inspection/Blocked/Other.
FISCALYEAR_PERIODVARCHARYYYYPPP fiscal period, resolved to calendar month via DIM_FISCAL_PERIOD.
TOTAL_STOCK_IM_QTY_BUOMNUMBEROn-hand quantity, base UOM — use this, not the _SU sibling (unit mismatch overstated supply by ~9.9M units live).
GIT_GL_QTY_BUOMNUMBERGoods-in-transit quantity, base UOM.
TOTAL_STOCK_QUANTITY_IM_GIT_BUOMNUMBEROn-hand + GIT combined quantity, base UOM.
TOTAL_STOCK_IM_VAL_RCNUMBEROn-hand value, reporting currency.
GIT_VAL_RCNUMBERGIT value, reporting currency.
TOTAL_STOCK_VAL_IM_GIT_RCNUMBERCombined on-hand + GIT value, reporting currency.
MATL_TYPEVARCHARMaterial type — '10MANE' (finished goods) gates the is_available_stock scope flag.
MRP_CONTROLLERVARCHARReporting-source MRP controller code.
The remaining ~59 columns are largely the _SU (single-UOM) quantity siblings deliberately not used downstream (unit-mismatch risk, see the on-hand-quantity note above) plus unused legacy batch/valuation-class attributes.
MARC_AMS_CONSUMER — 20 of 277 columns shown, 56,060 rows

Row count (live): 56,060
Total columns: 277

SAP MARC material-planning master — one row per material/plant, MRP parameters, lot sizing, and procurement attributes. The widest table by column count. Normalized to canonical 12NC/6-char plant in STAGING.STG_MATERIAL_PLANNING.

ColumnTypeBusiness Meaning
MATNRVARCHAR18-char SAP material number — stripped of leading zeros and prefixed '10' to canonical 12NC (applies to all forms, not just 18-char numeric).
PLANT_NBVARCHAR6-char plant code, preferred over WERKS when populated.
WERKSVARCHAR4-char plant code, fallback when PLANT_NB is blank (prefixed '10' downstream).
DISMMVARCHARMRP type.
DISPOVARCHARMRP controller code, prefixed '10' downstream.
PLIFZNUMBERPlanned delivery days.
WEBAZNUMBERGoods-receipt processing days.
EISBENUMBERSafety stock.
MINBENUMBERReorder point.
MOQNUMBERMinimum order quantity — a genuine quantity (median 100, max 113,400), unlike SLOWMO.MOQ.
BSTMINUMBERMinimum order quantity (lot-size constraint).
BSTMANUMBERMaximum order quantity (lot-size constraint).
BESKZVARCHARProcurement type.
MMSTAVARCHARMaterial status.
EKGRPVARCHARPurchasing group.
WZEITNUMBERTotal replenishment lead-time days.
DISLSVARCHARLot-sizing procedure code — the true procedure domain (16 categorical codes: WB, EX, X2, X4...).
LOSGRNUMBERCosting lot size — a numeric value, distinct from and easily confused with DISLS.
APOKZVARCHARAPO-relevant flag.
MAABCVARCHARABC classification.
The remaining ~257 columns are largely sparse/unused legacy SAP MRP fields (alternate planning strategy groups, forecast profile codes, secondary UOM conversions, plant-specific storage parameters) not consumed by any downstream transformation.
PO_LT_DATA_US — 21 of 131 columns shown, 12,072 rows

Row count (live): 12,072
Total columns: 131

Purchase-order lead-time bridge — one row per DC-PO/item, resolving the 18-char DCPO material to canonical 12NC and carrying vendor, value, and lead-time detail. Feeds both STG_PO (deduped PO fact) and STG_PO_EP_ALLOCATION (EP-PO allocation detail).

ColumnTypeBusiness Meaning
DC_PO_NUMBERVARCHARDC purchase order number — primary key grain.
DC_PO_ITEMVARCHARDC purchase order item — primary key grain.
DC_PO_PLANTVARCHAR4-char plant code, prefixed '10' downstream to 6-char canonical.
DCPO_MATERIALVARCHAR18-char zero-padded material — stripped/prefixed to canonical 12NC downstream (100% join rate).
DCPO_VENDORVARCHARDC-side supplier ID.
DCPO_NAMEVARCHARDC-side supplier name.
DCPO_QNUMBEROrdered quantity.
DCPO_BUOMVARCHAROrder unit of measure — needed since 339 of 8,116 POs mix ST/SET units.
DCPO_PO_TOTAL_VALUE_EURNUMBEREUR-converted PO value.
DCPO_PO_TOTAL_VALUENUMBERDocument-currency PO value — kept separate from the EUR figure, not mixed.
CURRENCYVARCHARDocument currency (always 'USD' on all 12,072 rows live).
EINDT_DATEDATEPlanned delivery date.
REQUESTED_PDTNUMBERRequested PDT-leg lead time in days (a duration, not a date).
ACTUAL_PDTNUMBERActual PDT-leg lead time in days.
ACTUAL_TOTAL_LTNUMBEREnd-to-end actual lead time — basis of the real supply_delay_days metric.
REQUESTED_LTNUMBEREnd-to-end requested lead-time baseline, paired with ACTUAL_TOTAL_LT.
DC_PO_GR_POSTING_DATEDATEGoods-receipt posting date.
DC_PO_RELEASE_DATEDATEPO release date.
GLOBAL_CHECKVARCHARData-quality flag — carried as an attribute, never used as a filter.
EP_PO_NUMBERVARCHARUpstream EP-PO allocation number (multiple EP-POs can fund one DC-PO line).
BGVARCHARBusiness group code.
The remaining ~110 columns are largely unused legacy SAP/EP-PO fields (secondary vendor-role attributes, alternate lead-time diagnostics, internal routing/approval codes) not consumed by STAGING.
SLOWMO_AMS_CONS — 18 of 99 columns shown, 124,287 rows

Row count (live): 124,287
Total columns: 99

Slow-moving/dead-stock inventory extract — one row per material/plant/period/sales-org slice, carrying aged-stock quantity/value buckets. Aggregated in STAGING (SUM measures, MAX attributes) to material+plant+period grain, since the source is not unique at that grain (52.5% of combinations carry more than one row).

ColumnTypeBusiness Meaning
MATERIAL_PLANTVARCHARComposite key; material 12NC is extracted from this field.
PLANTVARCHAR6-char canonical plant code.
PLANT_NAMEVARCHARPlant name — the authoritative source for DIM_PLANT's display name.
PERIODVARCHARYYYYMM calendar period.
OH_QNTNUMBEROn-hand quantity.
OH_VALUENUMBEROn-hand value, stored in kEUR (thousands of EUR) — multiplied by 1000 downstream.
GIT_QNTNUMBERGoods-in-transit quantity.
GIT_VALUENUMBERGoods-in-transit value, also in kEUR.
SLOW_MO_QNTNUMBERSlow-moving quantity.
SLOW_MO_VALUENUMBERSlow-moving value, in kEUR.
CUR_QTYNUMBERCurrent-month quantity.
PREV_QTYNUMBERPrior-month quantity.
BG_MDVARCHARBusiness group code (source header is literally 'BG (md)').
MAG_MDVARCHARTrue 3-char MAG code — MAG itself is the human-readable description, not the code.
PRODUCT_LIFE_CYCLE_PHASEVARCHARLifecycle phase — combined with on-hand qty > 0 to define dead stock ('Not-active'/'Phase out'/'Phase-out Initiated').
DEMANDVARCHAR'demand'/'no demand' flag — drives the demand_category classification (NULL rows, no stock position, are excluded).
MOQNUMBERA lot-size/rounding indicator (values 0-6) here, NOT a true order quantity — do not confuse with MARC_AMS_CONSUMER.MOQ.
MRP_CONTROLLERVARCHARReporting-source MRP controller code.
The 0-6mo/7-12mo/12mo+ aging-bucket quantity and value columns, QTY_DIFF/VALUE_DIFF, SMOS_MONTH_COUNT, ORU_KEY/MRU_KEY, BRAND, MANUFACTURER(_PLANT) and SAFETY_STOCK are also consumed downstream, following the same pattern as the columns shown above. The remaining ~65 columns are unused legacy SLOWMO fields (alternate sales-org breakdowns, internal snapshot version markers).
T_MD_MATERIAL_CONSUMER — 21 of 180 columns shown, 536,076 rows

Row count (live): 536,076
Total columns: 180

SAP BW material master (BIC_* enriched attributes) — one row per material, canonical 12NC already native. Source for DIM_MATERIAL's descriptive/classification attributes in STAGING.STG_MATERIAL_MASTER.

ColumnTypeBusiness Meaning
MATERIALVARCHARCanonical 12NC, no transform needed.
BASE_UOMVARCHARBase unit of measure.
EANUPCVARCHAREAN/UPC barcode.
BIC_CBRANDVARCHARBrand.
BIC_CSUCCESORVARCHARSuccessor material 12NC.
BIC_CLEDVARCHAR5-value LED classification code (10/15/00/20/80) — a category code, not a boolean.
BIC_CPRODCLASVARCHARProduct classification.
BIC_CPRODTYPEVARCHARProduct type — value '10' gates the is_in_scope_consumer_fg flag.
BIC_CPRODFAMVARCHARProduct family.
BIC_C10NCVARCHAR10-digit material number variant.
BIC_PMAGVARCHARMAG code.
BIC_PBUVARCHARBU code.
BIC_CTECHNOVARCHARTechnology attribute.
BIC_CVOLTAGEVARCHARVoltage attribute.
GROSS_WTNUMBERRaw gross weight — must be unit-normalized via UNIT_OF_WT before aggregating (92x overstatement if summed raw, live).
NET_WEIGHTNUMBERRaw net weight — same unit-normalization requirement as GROSS_WT.
UNIT_OF_WTVARCHARWeight unit code (KG/G/LB/MG); '#' is the SAP blank marker, distinct from NULL.
VOLUMENUMBERRaw volume — must be unit-normalized via VOLUMEUNIT before aggregating (11 possible source units).
VOLUMEUNITVARCHARVolume unit code (M3/CDM/CCM/HL/GLL/CFT/IN3/OZA/PT/QT).
MATL_TYPEVARCHARMaterial type — '10MANE' gates is_in_scope_consumer_fg alongside BIC_CPRODTYPE='10'.
DEL_FLAGVARCHARBW-deletion flag — drives DIM_MATERIAL.is_active rather than a hard exclusion filter.
The remaining ~159 columns are largely unused legacy BW attributes (secondary classification hierarchies, alternate packaging/dimension fields, historical revision markers). BIC_CCBRAND, BIC_CPRDSGM, BIC_CPRODGRP1/2/3, BIC_CPRODFAC, BIC_CALTMATNR, BIC_CSOFF, BIC_CXMPLSTAA(/DA), BIC_PGMRU, BIC_CCTRY_ORG, BIC_CPACKTYPE, PROD_HIER, MATL_GROUP, IND_SECTOR, CREATEDON and MANUFACTOR are also consumed downstream but omitted above for brevity.

STAGINGBusiness-Rule-Applied Staging Tables

Nine tables, each a cleaned, business-rule-applied, standardized version of one (or two closely related) RAW_TRUSTED source(s). Material and plant codes are standardized to their canonical form here.

STG_DEMAND_FORECAST — 27 columns, 246,026 rows

Grain: One row per material + plant + calendar month + key figure + category + organizational dimension combination (demand and sales rows unioned into one measure table)
Row count (live): 246,026
Built from (RAW_TRUSTED): DEMAND_QXP_AMS_CONS, SALES_AMS_CONS_VIPP

Combines statistical demand forecast (DEMAND_QXP) and actual sales (SALES_AMS_CONS_VIPP) into a single measure table keyed by material, plant, period and key figure, with physical quantity and monetary value strictly separated into their own columns so they can never be summed together by mistake.

Key business rules applied:
  • Only rows whose material code is fully numeric are kept, in both the demand and sales branches — this excludes every placeholder/dummy material family regardless of its specific prefix, rather than pattern-matching a fixed list of known placeholder codes.
  • Only rows with FIN_POST_IND = '#' (the SAP default/no-allocation marker) are kept. Other posting codes carry revenue values with no associated quantities — rebates, credits, reclassifications and offset entries — and would inflate reported revenue with postings that are not real sales.
  • Both branches are scoped to Distribution Channel '01' (Consumer) — the demand/sales pipeline is Consumer-only end to end.
  • Each business record is deduplicated to the latest source revision (by source_update_ts) per full business key, so superseded revisions are not summed as if they were additive rows.
  • Key figures are explicitly classified as QUANTITY or VALUE_EUR before storage; a raw value column is never passed through to downstream supply-impact logic without this classification.
ColumnTypeBusiness Meaning / Formula
material_12ncTEXTCanonical 12NC material code; already conformed in both source files, no transform needed.
plant_codeTEXT6-character canonical plant code; already conformed in both source files.
calendar_month_keyTEXTFiscal period recast as a YYYY-MM-01 calendar string for joining to other monthly tables.
key_figureTEXTRaw key-figure code (KF) identifying which measure the row's VALUE holds (e.g. quantity, QxP EUR, etc.).
categoryTEXTSource category classification; current-year vs prior-year actuals (ACT_CY / ACT_CY-1) are distinguished here, not in key_figure.
commercial_sub_teamTEXTCommercial sub-team slice; a genuinely distinct dimension member, needed so legitimately repeating material/plant/period/key-figure rows aren't collapsed as duplicates.
fin_post_indTEXTFinance posting indicator. Only the '#' (default/no-allocation) value is retained by the table's row filter.
measure_typeTEXTDerived classification of key_figure into 'QUANTITY', 'VALUE_EUR', or 'UNKNOWN', used to route the row into forecast_quantity or forecast_value_eur.
forecast_quantityNUMBER(18,4)Physical unit measure; populated only when key_figure represents units (quantity-type key figures).
forecast_value_eurNUMBER(18,4)Monetary measure in EUR; populated only when key_figure represents value (QxP / NNS / GAS / currency-bearing key figures).
currencyTEXTSource currency code for value-type rows.
oru_keyTEXTOperating Reporting Unit key.
mru_keyTEXTMarket Reporting Unit key.
bg_codeTEXTBusiness Group code, normalized to numeric-only form (strips prefixes such as 'BG') to match the canonical code form used elsewhere (e.g. STG_DRM).
bu_codeTEXTBusiness Unit code, normalized to numeric-only form for the same reason as bg_code.
channel_groupTEXTChannel group classification.
planning_accountTEXTAPO planning account; the join key to STG_DRM.planning_account.
manufacturer_keyTEXTFirst-in-chain manufacturer key.
manufacturer_nameTEXTFirst-in-chain manufacturer name.
ato_eto_flagTEXTAssemble-to-order / Engineer-to-order indicator.
lifecycle_phaseTEXTProduct lifecycle phase.
supply_classTEXTSupply classification.
segmentTEXTBusiness segment.
mrp_controllerTEXTMRP controller code; already canonical in source.
source_fileTEXTLiteral tag identifying which source table the row came from: 'DEMAND_QXP' or 'SALES_VIPP'.
source_update_tsTIMESTAMPSource system's last-update timestamp for the record; used to keep only the latest revision per business key.
_LOAD_TSTIMESTAMP_LTZTimestamp this row was standardized (source has no native load timestamp).
STG_DRM — 55 columns, 756,429 rows

Grain: One row per sales order line / delivery item
Row count (live): 756,429
Built from (RAW_TRUSTED): DRM_AMS_CONS

Delivery Reliability Metric (DRM) fact at the sales-order-line grain: order, shipment, customer and root-cause detail together with a derived on-time/complete delivery outcome and a prioritized miss-reason classification.

Key business rules applied:
  • Only rows with a populated material code are kept.
  • DRM/OTIF scoring is restricted to the standard-delivery item category ('10ZE01', ~96% of records); returns and free-of-charge lines are excluded, along with lines that have no eligible total line count.
  • Lines whose delay is flagged unmeasurable, and lines that were cancelled/rejected (a populated rejection reason), are excluded from the miss-rate denominator entirely (scored as NULL, not 0) rather than counted as either a hit or a miss.
  • A line with no actual delivery date is only treated as 'unknown, not yet due' while its agreed date is still in the future. Once the agreed date has passed with no delivery, it counts as a miss rather than staying excluded as unknown.
  • Channel 1004 (internal sales) is deliberately kept in this table — unlike the '01'-only scope applied to demand/sales — because internal sales are relevant to the DRM metric.
  • The true miss reason is derived from a priority-ordered set of indicator flags (Supply, then Sales, then Outbound, then Other/Misc) because the source's own root-cause text fields are empty; within each tier, specific flags are checked before that tier's catch-all flag so a specific cause is never masked by 'other'.
  • The delivery-requirement flag reflects a configured requirement, not actual fulfillment; actual completion is a separately derived flag based on delivered quantity versus agreed quantity.
  • AG code/name are preserved as text (not numeric) so leading zeros in the code are retained.
ColumnTypeBusiness Meaning / Formula
sales_order_numberTEXTSales order document number.
sales_order_itemTEXTSales order line item number.
delivery_numberTEXTDelivery document number.
delivery_itemTEXTDelivery line item number.
material_12ncTEXTCanonical 12NC material code; already conformed in source.
plant_codeTEXT6-character canonical plant code; already conformed in source.
mrp_controllerTEXTMRP controller code; already canonical in source.
planning_accountTEXTAPO planning account; fully overlaps STG_DEMAND_FORECAST.planning_account as a join key.
ship_to_id / ship_to_name / ship_to_countryTEXTShip-to party identity and location.
sold_to_id / sold_to_nameTEXTSold-to party identity.
er_root_cause / er_root_cause_descTEXTException-report root cause code/text (sparsely populated in source).
sor_root_cause / sor_root_cause_descTEXTService-order-reliability root cause code/text (sparsely populated in source).
bg_key / bg_nameTEXTBusiness Group key and name.
bu_code / bu_nameTEXTBusiness Unit code and name.
bannerTEXTCustomer banner.
ag_code / ag_nameTEXTAG code and label, preserved as text so leading zeros in the code are not lost.
mag_code / mag_nameTEXTMAG code and label.
cag_codeTEXTCAG code.
supplier_id_raw / supplier_nameTEXTExternal supplier identifier (raw source format) and name.
target_agreed_dp_dateDATETarget/agreed delivery-promise date.
so_creation_dateDATESales order item creation date.
best_confirmed_delivery_dateDATEBest confirmed delivery date.
actual_delivery_dateDATEActual delivery date; NULL if not yet delivered.
actual_goods_issue_dateDATEActual goods issue date.
appointment_dateDATEAppointment date at time of measurement.
max_appointment_dateDATELatest appointment date recorded.
actual_qtyNUMBER(18,4)Actual delivered quantity (source unit of measure).
agreed_qtyNUMBER(18,4)Agreed delivery-promise order-line quantity.
lines_drm / line_adpTEXTSupporting line-level counters carried from source.
drm_pctNUMBER(8,4)DRM percentage as reported by source; equals 100 * drm_scored_lines / drm_total_lines.
drm_total_lines / drm_scored_linesNUMBEREligible-line count and successfully-scored-line count; needed to tell an eligible failure (total=1, scored=0) apart from an ineligible line (total=0).
sor_total_lines / sor_scored_linesNUMBERSame eligibility/outcome pairing for the SOR metric.
er_total_lines / er_scored_linesNUMBERSame eligibility/outcome pairing for the ER metric.
missed_lines_erNUMBERCount of ER-missed lines.
adp_delay_daysNUMBERAgreed-delivery-promise delay in days (parsed numerically; non-numeric source values yield NULL).
is_adp_unmeasurableBOOLEANTRUE when the source delay value is the literal unmeasurable marker ('?'), so the line can be excluded from delay-based scoring rather than treated as a real 0-day or missing value.
item_categTEXTItem category code; delivery scoring is restricted to the standard-delivery category.
missed_no_stock, missed_supply_reason_for_rej, missed_supply_delivery_block, missed_del_group, missed_supply_othersNUMBER/BOOLEANSupply-tier miss-reason indicator flags.
missed_credit_block, missed_sales_delivery_block, missed_sales_reason_for_rej, missed_incomplete_order, missed_inconsistent_data, missed_sales_ex_credit_miscNUMBER/BOOLEANSales-tier miss-reason indicator flags.
missed_transport, missed_warehouse, missed_appointment_calls, missed_wrong_day, missed_outbound_ex_warehouse_transportNUMBER/BOOLEANOutbound-tier miss-reason indicator flags.
missed_miscNUMBER/BOOLEANCatch-all miss-reason indicator.
primary_delay_reasonTEXTDerived single miss reason, chosen by priority across all MISSED_* flags (Supply tier first, then Sales, then Outbound, then Other/Misc); each tier's specific flags are tested before that tier's catch-all.
delay_reason_groupTEXTDerived top-level grouping of primary_delay_reason into Supply / Sales / Outbound / Other.
is_drm_missBOOLEAN (tri-state via NULL)Derived DRM outcome. NULL = excluded from scoring (unmeasurable, cancelled/rejected, non-standard item category, or not yet due); TRUE = miss (including overdue lines with no delivery date yet); FALSE = on-time/complete.
complete_delivery_required_flagTEXTWhether complete delivery was a configured requirement for this line — a requirement/configuration indicator, not proof that delivery actually happened complete.
is_delivery_completeBOOLEANDerived actual-completion outcome: TRUE when delivered quantity meets or exceeds agreed quantity (and agreed quantity is positive).
appointment_flagTEXTAppointment-related status flag.
carrierTEXTCarrier name (sparsely populated).
shipment_tms_idTEXTTransport-management-system shipment identifier.
last_carrier_statusTEXTLast known carrier status from the TMS.
rejection_reason_code / rejection_reason_descTEXTRejection reason code and description, when the line was rejected.
delivery_block_code / delivery_block_descTEXTDelivery block code and description, when the line is blocked.
overall_delivery_statusTEXTDerived overall status: 'C' (completed) when an actual delivery date exists, else NULL — the source extract has no direct status column.
rejection_statusTEXTDerived rejection status: 'REJECTED' when a rejection reason code is present, else NULL.
_LOAD_TSTIMESTAMP_LTZTimestamp this row was standardized.
STG_PO — 30 columns, 12,063 rows

Grain: One row per DC purchase order + item (deduplicated to a single row per PO/item)
Row count (live): 12,063
Built from (RAW_TRUSTED): PO_LT_DATA_US (base/lead-time and vendor data), EKBE_DATA_PO (goods receipts), EKET_DATA_PO (schedule lines), EKES_DATA_PO (vendor confirmations)

Unified purchase-order fact at DC-PO + item grain: lead-time, vendor and value data from the PO lead-time extract, left-joined to aggregated goods-receipt, delivery-schedule and vendor-confirmation activity.

Key business rules applied:
  • Deduplicated to one row per DC-PO + item: the base source itself contains exact full-row duplicates for a handful of PO/item pairs, and every join below is against this deduplicated base so a missed dedup here would have re-doubled every downstream aggregate.
  • Goods-receipt, schedule-line and vendor-confirmation source data are each deduplicated at their own natural grain (by latest change timestamp) before being aggregated to PO+item, preventing duplicate source rows from inflating received/scheduled/confirmed quantities.
  • Received quantity nets goods-receipt movements using the debit/credit indicator (receipt vs. return/reversal) rather than a fixed list of movement-type codes, so purchase returns are correctly netted rather than silently excluded.
  • Earliest schedule and confirmation dates only consider lines that still have open (undelivered) quantity, so a fully-consumed historical schedule line can never win over the genuinely active expected date.
  • DC-PO and EP-PO vendor identities are exposed as two separate fields rather than merged, since a PO can be re-sourced to a different fulfilling vendor and collapsing the two would hide which counterparty actually shipped.
  • The EUR-denominated value and the document/local-currency value are published as two explicit value/currency pairs rather than mismatched, since the document currency and the EUR-converted amount are not the same figure.
  • Delay and lead-time figures are end-to-end (PO release/creation to goods-receipt posting), not just the vendor-confirmation leg; the confirmation-leg-only figure is retained separately as a diagnostic and must not drive on-time/lateness classification.
  • The data-quality flag is carried as an attribute for filtering, never applied as a row-exclusion filter.
  • EP-PO allocation detail is intentionally not carried at this grain, since some DC-PO/item combinations legitimately split across more than one EP-PO — that detail lives in STG_PO_EP_ALLOCATION instead.
ColumnTypeBusiness Meaning / Formula
po_numberTEXTDC purchase order number.
po_itemTEXTDC purchase order item/line number.
material_12ncTEXTCanonical 12NC, derived from the 18-character zero-padded DC-PO material code.
plant_codeTEXT6-character canonical plant code, derived from the 4-character DC-PO plant code.
dc_supplier_id / dc_supplier_name / dc_supplier_countryTEXTIdentity of the vendor actually fulfilling the DC purchase order.
ep_supplier_id / ep_supplier_name / ep_supplier_countryTEXTIdentity of the original/upstream (EP) vendor, kept separate from the DC vendor rather than merged, since a PO can be re-sourced to a different fulfilling vendor.
vendor_categoryTEXTVendor category classification.
po_typeTEXTPurchase order type.
bg_code / bu_codeTEXTBusiness Group / Business Unit codes.
mru_key / oru_keyTEXTMarket/Operating Reporting Unit keys.
ordered_qtyNUMBER(18,4)Quantity ordered on the PO line.
ordered_uomTEXTUnit of measure for ordered_qty; carried through as-is (no conversion) so mixed-unit POs can be identified downstream.
received_qtyNUMBER(18,4)Net received quantity, aggregated from goods-receipt movements with returns/reversals netted out.
open_qtyNUMBER(18,4)Derived: ordered_qty minus received_qty.
po_value_eurNUMBER(18,4)PO total value already converted to EUR by the source.
reporting_currencyTEXTLiteral 'EUR', paired explicitly with po_value_eur.
po_value_localNUMBER(18,4)PO total value in the document's own currency.
currencyTEXTDocument currency code paired with po_value_local (observed as 'USD' on essentially all rows).
po_release_dateDATEPO release date.
planned_delivery_dateDATEOriginally planned delivery date.
confirmed_delivery_dateDATEBest available expected delivery date: earliest open vendor confirmation, else earliest open schedule date, else the planned delivery date.
requested_pdt_daysNUMBERRequested vendor lead time in days (a day count, not a date).
actual_gr_dateDATEActual goods-receipt posting date (from goods-receipt activity, falling back to the source's own GR date).
supply_delay_daysNUMBER(8,2)End-to-end delay: actual total lead time minus requested lead time, PO release/creation to GR posting. Positive = late.
requested_lt_daysNUMBER(8,2)End-to-end requested lead-time baseline.
pdt_delay_days_diagnosticNUMBER(8,2)The vendor-confirmation-leg-only delay figure, retained as a diagnostic; not used for on-time or lateness classification.
actual_total_lt_daysNUMBERActual end-to-end lead time achieved, release/creation to GR posting.
marc_planned_lt_daysNUMBERPlanned lead time from the material master.
dq_global_check_failedNUMBER(1,0)Data-quality flag marking records with potential master-data or process issues that could distort lead-time analysis. Attribute only, never used to exclude rows.
schedule_qtyNUMBER(18,4)Quantity from vendor confirmations, falling back to scheduled quantity when no confirmation exists.
STG_PO_EP_ALLOCATION — 8 columns, 12,072 rows

Grain: One row per DC-PO + item + EP-PO + item allocation (full allocation detail, narrower dedup than STG_PO)
Row count (live): 12,072
Built from (RAW_TRUSTED): PO_LT_DATA_US

Preserves the full DC-PO-to-EP-PO allocation detail that STG_PO's DC-PO/item grain cannot represent whenever a single DC-PO/item is fulfilled by more than one EP-PO.

Key business rules applied:
  • Deduplicated only on the full natural key (DC-PO, DC-PO item, EP-PO, EP-PO item) — deliberately narrower than STG_PO's dedup, so a DC-PO/item that legitimately splits across multiple EP-POs keeps every allocation row rather than being collapsed to one.
  • Must not be joined back to STG_PO at DC-PO/item grain — doing so would re-fan-out the already-correct received/open quantity computed there.
  • Reconciles fully against STG_PO: the sum of ep_po_qty for a given DC-PO/item equals that item's dc_po_qty on every row.
ColumnTypeBusiness Meaning / Formula
dc_po_number / dc_po_itemTEXTDC purchase order number and item.
ep_po_number / ep_po_itemTEXTEP (upstream) purchase order number and item allocated against this DC-PO/item.
ep_po_qtyNUMBER(18,4)Quantity allocated to this EP-PO.
ep_po_creation_dateDATEEP-PO creation date.
ep_supplier_id / ep_supplier_name / ep_supplier_countryTEXTEP vendor identity for this allocation.
ep_inco_termTEXTIncoterm for the EP-PO.
ep_order_acknowledgementTEXTEP-PO order acknowledgement status.
dc_po_qtyNUMBER(18,4)Total ordered quantity on the parent DC-PO/item, repeated on every allocation row for reconciliation.
STG_INVENTORY — 18 columns, 1,655,310 rows

Grain: Material + plant + storage location + stock type + fiscal period
Row count (live): 1,655,310
Built from (RAW_TRUSTED): INVENTORY_AMS_CONS, joined to CURATED.DIM_FISCAL_PERIOD for calendar mapping

Inventory position aggregated from batch-level source detail up to material/plant/storage-location/stock-type/period grain. Storage location and stock type are deliberately preserved (not collapsed) so blocked and quality-inspection stock stay separately visible.

Key business rules applied:
  • Aggregation collapses only the batch dimension; material, plant, storage location, stock type and fiscal period are all preserved as separate grain members so questions about blocked or quality-inspection stock by location remain answerable.
  • On-hand, goods-in-transit and combined quantities all use the base-unit-of-measure source columns consistently — the single-unit-of-measure and base-unit-of-measure columns differ per material (e.g. 1 SET = 6 pieces), and mixing them would overstate total supply.
  • Stock type is decoded into a business label using only the three documented codes (Unrestricted / Quality inspection / Blocked) plus blank; any other observed code is bucketed as 'Other' rather than guessed at, since no authoritative decode exists for it.
  • 'Available stock' is exposed as a flag rather than enforced as a filter: on-hand quantity greater than zero, material type = finished goods, and stock type = Unrestricted. Consumers filter on the flag for availability KPIs while the full stock picture, including blocked and quality-inspection stock, stays queryable.
  • The value columns carry the source's reporting currency, which is not guaranteed to be EUR.
ColumnTypeBusiness Meaning / Formula
material_12ncTEXTCanonical 12NC material code; already conformed in source.
plant_codeTEXT6-character canonical plant code; already conformed in source.
storage_locationTEXTStorage location code.
stock_typeTEXTRaw stock type code.
fiscal_period_codeTEXTSource fiscal year/period code (YYYYPPP).
calendar_month_keyDATECalendar-month key resolved via DIM_FISCAL_PERIOD.
fiscal_yearNUMBERFiscal year, resolved via DIM_FISCAL_PERIOD.
fiscal_period_numNUMBERFiscal period number within the year, resolved via DIM_FISCAL_PERIOD.
on_hand_qtyNUMBER(18,4)On-hand stock quantity, summed across batches in base unit of measure.
git_qtyNUMBER(18,4)Goods-in-transit quantity, summed across batches in base unit of measure.
total_qty_incl_gitNUMBER(18,4)On-hand plus goods-in-transit quantity, summed in base unit of measure.
on_hand_value_eurNUMBER(18,4)On-hand value in the source reporting currency (not necessarily EUR despite the column name).
git_value_eurNUMBER(18,4)Goods-in-transit value in the source reporting currency.
total_value_eurNUMBER(18,4)Combined on-hand plus GIT value in the source reporting currency.
stock_type_descTEXTDerived business label for stock_type: 'Unrestricted' (A), 'Quality inspection' (Q), 'Blocked' (D), 'Unspecified' (blank), or 'Other' (any undocumented code).
is_unrestrictedBOOLEANTRUE when stock_type = 'A' (Unrestricted).
is_available_stockBOOLEANDerived availability flag: on-hand quantity > 0, material type is finished-goods, and stock type is Unrestricted.
mrp_controllerTEXTMRP controller code; already canonical in source.
STG_FORECAST_BIAS — 15 columns, 62,509 rows

Grain: Material + planning account + fiscal period + distribution channel
Row count (live): 62,509
Built from (RAW_TRUSTED): FC_BIAS_FACC, joined to CURATED.DIM_FISCAL_PERIOD for calendar mapping

Forecast bias / accuracy snapshot comparing planned quantities across multiple forecast horizons (three periods back through the current period) against actual delivered quantity, at material/planning-account/period/channel grain.

Key business rules applied:
  • The true grain includes distribution channel, not just material + planning account + period — omitting it causes rows for different channels (e.g. Consumer vs. Professional) sharing the same material/account/period to collide into one another.
  • Scoped to Distribution Channel '1001' (Consumer) only. This is the only table in the extract whose source data spans beyond Consumer; the non-Consumer rows are excluded so the table stays comparable with the other Consumer-only tables it joins to.
  • This source represents the distribution channel with a 4-digit code ('1001') where demand/sales tables use a 2-digit code ('01') for the same Consumer population — the two are equivalent encodings of the same scope, not different scopes.
ColumnTypeBusiness Meaning / Formula
material_12ncTEXTCanonical 12NC material code.
planning_accountTEXTAPO planning account code.
distribution_channelTEXTDistribution channel code (4-digit form in this source, e.g. '1001').
distribution_channel_descTEXTDistribution channel description.
scm_area_codeTEXTCountry-level SCM area code; cannot be joined directly to plant-grain tables.
fiscal_period_codeTEXTSource fiscal year/period code (YYYYPPP).
calendar_month_keyDATECalendar-month key resolved via DIM_FISCAL_PERIOD.
fiscal_yearNUMBERFiscal year, resolved via DIM_FISCAL_PERIOD.
fiscal_period_numNUMBERFiscal period number within the year, resolved via DIM_FISCAL_PERIOD.
bg / bu / mag / cagTEXTBusiness Group, Business Unit, MAG and CAG classification codes.
planned_qty_n3 / planned_qty_n2 / planned_qty_n1 / planned_qty_nNUMBER(18,4)Snapshot of planned quantity taken 3, 2, 1 periods before, and at, the current period.
actual_delivered_qtyNUMBER(18,4)Actual delivered quantity, corrected.
abs_dev_n3 / abs_dev_n2 / abs_dev_n1 / abs_dev_n0NUMBER(18,4)Absolute deviation between planned and actual at each snapshot horizon.
planned_qxp_n3 / planned_qxp_n2 / planned_qxp_n1 / planned_qxp_nNUMBER(18,4)Snapshot of planned QxP (value) figure at each forecast horizon.
cf_abs_dev_n3 / cf_abs_dev_n2 / cf_abs_dev_n1 / cf_abs_dev_n0NUMBER(18,4)Calculated absolute deviation for the QxP figure at each horizon.
STG_MATERIAL_PLANNING — 24 columns, 56,060 rows

Grain: One row per material + plant (MRP view)
Row count (live): 56,060
Built from (RAW_TRUSTED): MARC_AMS_CONSUMER

Material Requirements Planning (MRP) parameters at material/plant grain: lot sizing, safety stock, reorder point, procurement type and lead times.

Key business rules applied:
  • The material-code transform is applied to every source material code format present — 18-character zero-padded numeric codes and non-padded alphanumeric codes alike — rather than gating on an 18-character length, which would leave a meaningful share of records unable to join to the material dimension.
  • Plant code prefers the source's pre-formed 6-character plant code when populated, falling back to deriving it from the 4-character plant code only when needed.
  • The lot-size quantity (a number) and the lot-sizing procedure (a categorical code) are two distinct source columns and are kept as two distinct output columns rather than conflated.
  • Only rows with a populated material code, and a resolvable plant code from either source field, are kept.
ColumnTypeBusiness Meaning / Formula
material_12ncTEXTCanonical 12NC, derived from the source material code (handles both zero-padded numeric and non-padded alphanumeric source formats).
plant_codeTEXT6-character canonical plant code: uses the pre-formed plant code when present, otherwise derives it from the 4-character plant code.
mrp_typeTEXTMRP type.
mrp_controllerTEXTMRP controller code, with the standard prefix applied.
planned_delivery_daysNUMBERPlanned delivery time in days.
gr_processing_daysNUMBERGoods-receipt processing time in days.
safety_stockNUMBER(18,4)Safety stock quantity.
reorder_pointNUMBER(18,4)Reorder point quantity.
moqNUMBER(18,4)Minimum order quantity (a genuine quantity figure from this source).
min_order_qtyNUMBER(18,4)Minimum lot size.
max_order_qtyNUMBER(18,4)Maximum lot size.
procurement_typeTEXTProcurement type (make/buy indicator).
special_procurement_keyTEXTSpecial procurement key.
material_statusTEXTMaterial status code.
material_status_valid_fromDATEDate the material status became effective.
purchasing_groupTEXTPurchasing group responsible for the material.
total_replenishment_lt_daysNUMBERTotal replenishment lead time in days.
lot_sizing_procedure_codeTEXTThe true categorical lot-sizing procedure code (distinct from the numeric lot-size quantity below).
costing_lot_size_qtyNUMBER(18,4)The numeric costing lot-size quantity (distinct from the procedure code above).
apo_relevant_flagTEXTAPO relevance indicator.
profit_centerTEXTProfit center code.
abc_classificationTEXTABC classification code.
apo_typeTEXTAPO material type.
_LOAD_TSTIMESTAMP_LTZTimestamp this row was standardized.
STG_SLOW_MOVING — 28 columns, 72,110 rows

Grain: Material + plant + calendar month, aggregated across sales organizations
Row count (live): 72,110
Built from (RAW_TRUSTED): SLOWMO_AMS_CONS

Slow-moving and dead-stock inventory position per material/plant/month, aggregated up from a source grain that fans out across sales organizations, with all monetary values converted from thousands of EUR to EUR.

Key business rules applied:
  • All monetary columns are converted from the source unit (thousands of EUR) to EUR by multiplying by 1000; quantity columns need no conversion.
  • Every row with a populated stock-position indicator is kept and classified as 'demand' (active article still carrying slow-moving stock) or 'no demand' (zero-demand article); only rows representing no stock position that month are excluded.
  • Material + plant + period is not naturally unique in the source — it fans out across sales organizations — so the table is explicitly aggregated to that grain: additive measures (quantities, values) are summed, and descriptive attributes take a single representative value across the fanned-out rows.
  • The lot-size-indicator column is a rounding/lot-size indicator, not an order quantity, and is deliberately given a distinct name so it cannot be confused with the genuine minimum-order-quantity figure carried elsewhere in material planning data.
  • Dead stock is a lifecycle condition, not a demand-signal condition: on-hand quantity greater than zero for a product whose lifecycle phase is inactive/phased-out. An active product simply having a quiet month is not dead stock.
ColumnTypeBusiness Meaning / Formula
material_12ncTEXTCanonical 12NC material code, extracted from the source's composite material/plant key field.
plant_codeTEXT6-character canonical plant code; already conformed in source.
plant_name_rawTEXTPlant name, taking the non-blank value across the fanned-out source rows.
calendar_month_yyyymmTEXTSource period in YYYYMM form.
calendar_month_keyTEXTPeriod recast as a YYYY-MM-01 calendar string for joining to other monthly tables.
on_hand_qty / on_hand_valueNUMBER(18,4)On-hand quantity and value (value converted to EUR), summed across fanned-out source rows.
git_qty / git_valueNUMBER(18,4)Goods-in-transit quantity and value (value converted to EUR), summed.
qty_0_6m / qty_7_12m / qty_gt_12mNUMBER(18,4)On-hand quantity aged 0-6 months, 7-12 months, and over 12 months, summed.
value_7_12m / value_gt_12mNUMBER(18,4)On-hand value (EUR) aged 7-12 months and over 12 months, summed.
slow_mo_qty / slow_mo_valueNUMBER(18,4)Slow-moving quantity and value (EUR), summed.
current_qty / prior_month_qtyNUMBER(18,4)Current and prior-month quantity, summed.
current_value / prior_month_valueNUMBER(18,4)Current and prior-month value (EUR), summed.
qty_mom_delta / value_mom_deltaNUMBER(18,4)Month-over-month change in quantity and value (EUR), summed.
smos_month_countNUMBERSlow-moving/obsolete-stock month counter, taking a representative value across fanned-out rows.
bg_code / bu_codeTEXTBusiness Group / Business Unit codes, taking a representative value across fanned-out rows.
mag_code / mag_nameTEXTMAG code (from the true coded field, not the description field) and its readable name.
lifecycle_phaseTEXTProduct lifecycle phase, used to determine dead-stock status.
oru_key / mru_keyTEXTOperating/Market Reporting Unit keys.
brandTEXTBrand.
source_manufacturer_idTEXTManufacturer identifier as recorded in this source.
manufacturer_plantTEXTManufacturer plant.
safety_stock_rawTEXTSafety-stock value as recorded in this source.
slowmo_lot_size_indicatorTEXTA lot-size/rounding indicator from this source, deliberately renamed and kept separate from the genuine minimum-order-quantity figure in material planning data — the two share a similar source name but hold incompatible meanings.
mrp_controllerTEXTMRP controller code; already canonical in source.
demand_flagTEXTRepresentative demand-signal value across fanned-out rows: 'demand' (active article still carrying slow-moving stock) or 'no demand' (zero-demand article).
demand_categoryTEXTDerived label for demand_flag: 'Active' or 'No demand this period'.
is_dead_stockBOOLEANDerived flag: TRUE when on-hand quantity is greater than zero and the product's lifecycle phase indicates it has been phased out.
_LOAD_TSTIMESTAMP_LTZTimestamp this row was standardized.
STG_MATERIAL_MASTER — 41 columns, 536,076 rows

Grain: One row per material
Row count (live): 536,076
Built from (RAW_TRUSTED): T_MD_MATERIAL_CONSUMER

Material master attributes at the material level: brand and commercial hierarchy, product classification, physical dimensions, and lifecycle/status fields.

Key business rules applied:
  • Weight is normalized to kilograms from whatever unit the source row records (kg/g/lb/mg); an unmapped or blank unit resolves to NULL rather than being assumed to be kilograms, since a visibly missing value is safer than a silently wrong unit assumption.
  • Volume is normalized to cubic meters from any of 11 source units, including imperial units, for the same reason.
  • Volume values that normalize to over 100 cubic meters for a single article are flagged as implausible rather than dropped — the row stays in the data, but the flag lets it be excluded from any volume rollup until the source value is corrected.
  • The SAP blank-value marker is treated explicitly as blank wherever it appears in classification logic (unit codes, product type), since a plain NULL check alone would not catch it.
  • In-scope Consumer finished-goods materials are identified with a flag (material type = finished goods and product type = 10), not enforced as a filter — hard-filtering this dimension would orphan any fact row that references an out-of-scope material, since it is a conformed dimension referenced from multiple fact tables.
  • BW-deleted materials are retained as rows rather than excluded, so every fact table that references a material always finds a matching row; deletion status is exposed as an attribute instead of being used to drop records.
  • Only rows with a populated material code are kept.
ColumnTypeBusiness Meaning / Formula
material_12ncTEXTCanonical 12NC material code; already conformed in source.
base_uomTEXTBase unit of measure.
ean_upcTEXTEAN/UPC barcode.
brandTEXTBrand code.
commercial_brandTEXTCommercial brand code.
successor_12ncTEXTSuccessor material's 12NC, when this material has been superseded.
commercial_release_dateDATECommercial release date.
deletion_dateDATEDeletion date.
led_indicator_codeTEXTLED classification code (a 5-value categorical code, not a true/false indicator).
innovation_flagTEXTInnovation classification.
innovation_dateDATEInnovation date.
product_class / product_segment / product_typeTEXTProduct classification hierarchy fields.
product_group_1 / product_group_2 / product_group_3TEXTProduct grouping hierarchy fields.
product_familyTEXTProduct family.
product_facilityTEXTProduct facility.
alternate_material_nrTEXTAlternate material number.
material_10ncTEXT10-digit material code variant.
sales_off_flagTEXTSales-off status flag.
cross_plant_status / cross_plant_status_dateTEXT / DATECross-plant material status and its effective date.
mag_codeTEXTMAG code.
bu_codeTEXTBusiness Unit code.
mru_codeTEXTMarket Reporting Unit code.
technologyTEXTTechnology classification.
voltageTEXTVoltage classification.
country_of_originTEXTCountry of origin.
packaging_typeTEXTPackaging type.
gross_wt / net_weight / volumeTEXT (raw)Raw source weight/volume values in their original mixed units — kept for lineage but must not be aggregated directly; use the *_kg / *_m3 columns instead.
unit_of_wtTEXTUnit of measure for gross_wt/net_weight.
volume_unitTEXTUnit of measure for volume.
gross_weight_kg / net_weight_kgNUMBER(18,6)Weight normalized to kilograms from whatever unit the row used; NULL when the unit is unmapped or blank, rather than assuming kilograms.
volume_m3NUMBER(18,9)Volume normalized to cubic meters from any of the 11 source units (including imperial); NULL when the unit is unmapped or blank.
is_volume_implausibleBOOLEANFlag (not a filter): TRUE when the normalized volume exceeds 100 cubic meters for a single article — implausible for a consumer lighting product and likely a source decimal error. Rows stay in the data but should be excluded from volume rollups.
product_hierarchyTEXTProduct hierarchy code.
material_groupTEXTMaterial group.
ind_sectorTEXTIndustry sector.
material_typeTEXTMaterial type code.
is_in_scope_consumer_fgBOOLEANFlag (not a filter): TRUE when material type is finished-goods (10MANE) and product type is 10 — the client-confirmed Consumer finished-goods scope. Consumers apply this flag themselves; the dimension itself stays complete.
created_onDATERecord creation date.
manufacturer_idTEXTManufacturer identifier.
deleted_in_bwTEXTBW deletion-flag status; deleted materials are retained as rows here, with this field marking their status rather than being dropped.
_LOAD_TSTIMESTAMP_LTZTimestamp this row was standardized.

CURATEDConformed Star Schema

Dimensions, bridges, and facts with real primary/foreign keys. This is the layer every AGGREGATE table and SEMANTIC view is built on.

Dimensions & Bridges (11 tables)

DIM_FISCAL_PERIOD — 18 columns

Grain: One row per calendar month, 2021–2030 (120 rows)
Primary key: FISCAL_PERIOD_CODE
Source: Generated calendar (not sourced from a transactional table)

The period calendar used across the entire pipeline. FISCAL_PERIOD_CODE (YYYYPPP) is a calendar encoding, not a true SAP fiscal calendar — PPP is simply the calendar month number (001=January … 012=December), confirmed by cross-correlating INVENTORY (keyed YYYYPPP) against SLOWMO (keyed YYYYMM) for the same material+plant: the 001=January mapping matched 86% of periods vs. 18% for a fiscal August-start calendar.

ColumnTypeBusiness Meaning
FISCAL_PERIOD_CODETEXTPrimary key. YYYYPPP string, PPP = calendar month. Matches the period fields used in the inventory and forecast-bias sources.
FISCAL_YEARNUMBERCalendar year component (named fiscal_year for downstream compatibility; equals the calendar year).
PERIOD_NUMNUMBERCalendar month number (1–12).
CALENDAR_START_DATEDATEFirst day of the calendar month.
CALENDAR_MONTH_KEYTEXTISO string YYYY-MM-01. Primary join key to the demand and slow-moving facts.
CALENDAR_MONTH_YYYYMMTEXTYYYYMM compact string. Join key to the slow-moving fact's native period format.
MONTH_NAMETEXTAbbreviated month name (Jan … Dec).
CALENDAR_MONTH_NUMNUMBERCalendar month as integer (alias of PERIOD_NUM).
CALENDAR_YEARNUMBERCalendar year as integer (alias of FISCAL_YEAR).
CALENDAR_QUARTERNUMBERCalendar quarter (1–4).
FISCAL_HALFTEXTH1 (Jan–Jun) or H2 (Jul–Dec).
FISCAL_QUARTERTEXTCalendar quarter as a display string (Q1–Q4).
IS_YEAR_END_PERIODBOOLEANTRUE when period_num = 12 (December).
IS_ADJUSTMENT_PERIODBOOLEANTRUE for a 13th-period SAP adjustment period. Always FALSE — no period-013 codes exist in this dataset.
CALENDAR_END_DATEDATELast day of the calendar month.
MAPPING_STATUSTEXTDATA_VALIDATED — confirmed by cross-correlating inventory and slow-moving periods for the same material+plant (86% match rate).
MAPPING_SOURCETEXTMethod used to validate the mapping (empirical cross-source correlation).
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
DIM_MATERIAL — 41 columns

Grain: One row per unique 14-digit material code (536,076 rows)
Primary key: MATERIAL_12NC
Source: Material master, enriched with lifecycle/supply-class attributes from the demand-planning source

The conformed product master. MATERIAL_12NC is the universal join key used across every CURATED fact and dimension table. Lifecycle phase and supply class are resolved from plant-level demand-planning data (not the material master itself) because they're more current there — where different plants report different values for the same material, the modal value is kept and a conflict flag/count is exposed alongside it.

ColumnTypeBusiness Meaning
MATERIAL_12NCTEXTPrimary key. 14-digit Signify product code.
BRANDTEXTTop-level Signify brand (e.g. Philips).
COMMERCIAL_BRANDTEXTSub-brand or commercial label within the top-level brand.
PRODUCT_CLASSTEXTCommercial product classification. 100% NULL in this extract — never populated by source.
PRODUCT_SEGMENTTEXTMid-level product segment within product class.
PRODUCT_TYPETEXTProduct technology type (e.g. LED Lamp, Gear).
IND_SECTORTEXTSAP industry sector code.
PRODUCT_FAMILYTEXTCommercial product family (internal family codes). Hue/WiZ/LED Lamps & Luminaires are business units, not families — resolve those via the business-unit dimension, not this column.
PRODUCT_GROUP_1TEXTSAP product group level 1.
PRODUCT_GROUP_2TEXTSAP product group level 2. Near-entirely NULL (99.4%).
TECHNOLOGYTEXTLight-source technology (LED, HID, Fluorescent).
VOLTAGETEXTNominal operating voltage class. 100% NULL — never populated.
COUNTRY_OF_ORIGINTEXTISO 2-letter manufacturing country. 100% NULL — never populated.
PACKAGING_TYPETEXTPrimary packaging format. 100% NULL — never populated.
EAN_UPCTEXTEAN-13/UPC-A barcode.
BASE_UOMTEXTSAP base unit of measure. Every quantity column across CURATED facts uses this unit.
WEIGHT_UOMTEXTUnit of measure for the two weight columns (always KG in this dataset).
GROSS_WEIGHT_KGFLOATGross weight normalized to kilograms (source carries mixed KG/G/LB/MG units — this is the converted figure; unmapped units resolve to NULL rather than an assumed KG).
NET_WEIGHT_KGFLOATNet weight normalized to kilograms, same conversion rule.
COMMERCIAL_RELEASE_DATEDATEFirst commercial release date.
DELETION_DATEDATESAP deletion/discontinuation date. Populated = marked for deletion.
LED_INDICATOR_CODETEXTSignify LED indicator attribute.
INNOVATION_FLAGTEXTNew-launch/innovation flag. 100% NULL — never populated.
SALES_OFF_FLAGTEXTTRUE when flagged end-of-life/no-new-orders.
CROSS_PLANT_STATUSTEXTSAP cross-plant material status code.
SUCCESSOR_12NCTEXTReplacement product code when this material is being phased out.
LIFECYCLE_PHASETEXTProduct lifecycle phase (Introduction/Growth/Maturity/Decline/Phase-Out). Resolved from plant-level data — see the conflict-count column.
SUPPLY_CLASSTEXTReplenishment strategy code (e.g. MTS=Make-to-Stock, MTO=Make-to-Order). Same plant-level resolution caveat as lifecycle phase.
ATO_ETO_FLAGTEXTAssemble-to-Order / Engineer-to-Order indicator.
MANUFACTURER_NAMETEXTPrimary manufacturer name.
SUPPLY_CLASS_HAS_PLANT_CONFLICTBOOLEANTRUE when different plants report different supply_class values for this material — the published value is the modal (most common) one and may not apply everywhere.
SUPPLY_CLASS_DISTINCT_COUNTNUMBERNumber of distinct supply_class values observed across plants for this material.
LIFECYCLE_PHASE_HAS_PLANT_CONFLICTBOOLEANSame conflict flag for lifecycle_phase.
LIFECYCLE_PHASE_DISTINCT_COUNTNUMBERNumber of distinct lifecycle_phase values across plants.
PRODUCT_HIERARCHYTEXTSAP product hierarchy code (PRDHA).
MATERIAL_GROUPTEXTSAP material group (MATKL).
MATERIAL_TYPETEXTSAP material type (e.g. FERT=Finished Good).
MANUFACTURER_IDTEXTSignify internal manufacturer ID. 100% NULL — never populated.
IS_ACTIVEBOOLEANTRUE when the material has no deletion date and is not flagged sales-off.
IS_AGGREGATE_KEYBOOLEANTRUE when material_12nc is a non-canonical planning aggregate key (e.g. a planning-hierarchy placeholder) rather than a real 14-digit product code. These have no inventory records — filter them out before joining to inventory.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
DIM_PLANT — 9 columns

Grain: One row per distinct plant code across all source tables (37 rows)
Primary key: PLANT_CODE
Source: Union of plant codes appearing in the material-planning, inventory, delivery, slow-moving, and purchasing sources

Plant / distribution-center master. Country is derived from the plant-code prefix (e.g. 10US01 → United States) since no source carries a clean authoritative country name field.

ColumnTypeBusiness Meaning
PLANT_CODETEXTPrimary key. SAP plant code, the plant-level join key across every CURATED fact table.
PLANT_NAMETEXTDescriptive plant/DC name.
COUNTRYTEXTCountry name, derived from the plant-code prefix.
COUNTRY_DERIVEDTEXTIdentical to COUNTRY — both derived the same way.
COUNTRY_ISOTEXT2-letter ISO country code, extracted from the plant-code prefix.
PLANT_TYPETEXTPlant role classification (DC/Manufacturing/Warehouse). 100% NULL — never populated.
IS_US_PLANTBOOLEANTRUE when the plant code carries the 'US' prefix. The canonical way to scope any query to the US market.
REGIONTEXTGeographic region. Always 'AMS' (Americas) in this POC.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
DIM_SUPPLIER_SOURCE — 9 columns

Grain: One row per distinct supplier per ID namespace (186 rows)
Primary key: SUPPLIER_SK
Source: Union of purchasing, delivery-reliability, and demand-planning supplier/manufacturer references

Suppliers are tracked in three separate, non-overlapping ID namespaces that must never be cross-joined without a business-provided mapping: PO_LT (the purchasing-org vendor, from purchase orders), DRM (the delivery-reliability external supplier), and DEMAND_MANUFACTURER (the manufacturer referenced in demand-planning data). The same raw numeric ID can mean a different real-world supplier in each namespace — always filter by SUPPLIER_ID_SPACE before joining.

ColumnTypeBusiness Meaning
SUPPLIER_SKTEXTPrimary key. Deterministic hash of (supplier_id_space, source_supplier_id).
SUPPLIER_ID_SPACETEXTNamespace: PO_LT / DRM / DEMAND_MANUFACTURER. Always pair with source_supplier_id — the same raw ID can collide across namespaces.
SOURCE_SUPPLIER_IDTEXTRaw supplier identifier within its namespace. Not unique without supplier_id_space.
SUPPLIER_NAMETEXTSupplier/manufacturer display name.
SUPPLIER_COUNTRYTEXTSupplier country, when available from source.
VENDOR_CATEGORYTEXTBusiness category of the supplier (e.g. Internal, Third-Party).
SOURCE_SYSTEMTEXTAuthoritative source system for this record.
MAPPING_STATUSTEXTStatus of the enterprise-wide supplier mapping. Currently 'ASSUMED' pending a business-provided enterprise supplier master.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
BRIDGE_SUPPLIER_ENTERPRISE_MAPPING — 8 columns

Grain: One row per DC↔manufacturer supplier link (35 rows)
Primary key: SUPPLIER_SK
Source: Direct DC-supplier-to-manufacturer links recorded in the purchasing source itself

Maps a purchasing-org (DC) vendor to its upstream manufacturer (EP) enterprise identity, where multiple DC vendor records can resolve to the same manufacturer. This is a direct link recorded in the source purchase-order extract, not a fuzzy/probabilistic match, so confidence is 1.0 for every row — still labeled 'ASSUMED' pending a business-provided enterprise supplier master, matching the convention used by the supplier dimension itself.

ColumnTypeBusiness Meaning
SUPPLIER_SKTEXTFK → DIM_SUPPLIER_SOURCE. The source-system-specific supplier being mapped.
ENTERPRISE_SUPPLIER_IDTEXTCanonical enterprise-wide supplier identifier.
MAPPING_STATUSTEXTStatus of this mapping (ASSUMED / BUSINESS_CONFIRMED / UNMATCHED).
MAPPING_CONFIDENCEFLOATConfidence score 0–1. 1.0 here since it's a direct link recorded in source, not inferred.
MAPPING_SOURCETEXTHow the mapping was established.
VALID_FROMDATEEffective-from date. 100% NULL — never populated.
VALID_TODATEEffective-through date. 100% NULL — never populated.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
DIM_CUSTOMER — 5 columns

Grain: One row per unique customer ID, ship-to or sold-to (2,144 rows)
Primary key: CUSTOMER_ID
Source: Ship-to and sold-to party references from the delivery-reliability source

A single customer_id may act as both a ship-to (delivery recipient) and sold-to (billing/ordering) party — this table holds one row per unique ID regardless of role. Country is only available for ship-to rows (the source does not carry sold-to country).

ColumnTypeBusiness Meaning
CUSTOMER_IDTEXTPrimary key. SAP ship-to or sold-to party number.
CUSTOMER_NAMETEXTCustomer display name.
COUNTRYTEXTCustomer country (ship-to geography only; NULL for sold-to-only IDs).
COUNTRY_HAS_CONFLICTBOOLEANTRUE when this customer_id appears with more than one non-null country across source rows — when TRUE, the country value is unreliable; use the delivery fact's row-level ship-to country instead.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
DIM_BUSINESS_UNIT — 8 columns

Grain: One row per Business Group × Business Unit × MAG combination (64 rows)
Primary key: BU_ID
Source: Union of the business-hierarchy attributes from the delivery-reliability and demand-planning sources

The full-grain business hierarchy table. Do not use this table directly for BU-level grouping — one BU_CODE spans multiple MAG entries here, so grouping by bu_code on this table double-counts. Use DIM_BUSINESS_UNIT_BYCODE (below) for a clean one-row-per-BU lookup instead.

ColumnTypeBusiness Meaning
BU_IDTEXTPrimary key. Composite: bg_key|bu_code|mag_code.
BG_KEYTEXTBusiness Group code (e.g. 9003). The highest level in the Signify commercial hierarchy.
BG_NAMETEXTBusiness Group display name (e.g. Consumer). May be NULL — use DIM_BUSINESS_UNIT_BYCODE.bg_name which resolves cross-BU.
BU_CODETEXTBusiness Unit code (e.g. 9540 = Hue Connected). Not unique in this table.
BU_NAMETEXTBusiness Unit display name. May be NULL here — see DIM_BUSINESS_UNIT_BYCODE for the resolved fallback.
MAG_CODETEXTMarket and Application Group code — the sub-level below BU. Available on the slow-moving and forecast-performance facts but NOT on the demand-forecast fact.
MAG_NAMETEXTMAG display name.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
DIM_BUSINESS_UNIT_BYCODE — 4 columns

Grain: One row per unique Business Unit code (4 rows: 0118, 2596, 9540, 9668)
Primary key: BU_CODE
Source: CURATED-to-CURATED view collapsed from DIM_BUSINESS_UNIT — not sourced from STAGING

The clean, one-row-per-BU lookup used by every semantic view for BU-level rollups without fan-out. BU name is resolved across all rows sharing that BU; BG name is resolved across all BUs sharing that BG, so every code reliably gets a readable label (falling back to the code itself only if truly no name exists anywhere in source). All four BUs in this POC sit under one Business Group — BG_KEY='BS9003' (Consumer): 0118=LED Lamps & Luminaires, 2596=Modular, 9540=Hue Connected, 9668=WiZ Connected.

ColumnTypeBusiness Meaning
BU_CODETEXTPrimary key. Business Unit code.
BU_NAMETEXTBusiness Unit display name, resolved cross-source.
BG_KEYTEXTBusiness Group code.
BG_NAMETEXTBusiness Group display name, resolved cross-source.
DIM_DELAY_REASON — 5 columns

Grain: One row per distinct delay/miss reason code (14 rows)
Primary key: REASON_CODE
Source: Union of the DRM miss-bucket categories and SAP rejection reason codes

Delivery-miss reason reference. Combines three sources: the DRM system's coded miss-bucket categories (the primary, most-populated source), SAP rejection reason codes, and SOR (schedule-of-record) root-cause codes — the latter carry no description text in source, so reason_description is deliberately left NULL rather than invented for those rows.

ColumnTypeBusiness Meaning
REASON_CODETEXTPrimary key. Delay/miss reason code.
REASON_DESCRIPTIONTEXTHuman-readable description. NULL for SOR-sourced codes (no description exists in source).
REASON_GROUPTEXTHigher-level category (e.g. Supply, Commercial, Logistics, 'Sales: rejection').
REASON_SOURCETEXTWhich system assigned the code: DRM_MISS_BUCKET, REASON_FOR_REJECTION, or SOR_ROOT_CAUSE.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
BRIDGE_MATERIAL_PLANT — 26 columns

Grain: One row per material-plant combination (56,060 rows)
Primary key: MATERIAL_12NC, PLANT_CODE
Source: Material-planning (MRP) master data

Replenishment and MRP parameters per material-plant pair: safety stock, reorder point, planned lead time, procurement type, and ABC classification.

ColumnTypeBusiness Meaning
MATERIAL_12NCTEXTPart of composite PK. FK → DIM_MATERIAL.
PLANT_CODETEXTPart of composite PK. FK → DIM_PLANT.
MRP_TYPETEXTSAP MRP type controlling how replenishment is triggered (e.g. PD=MRP-driven, VB=reorder-point).
MRP_CONTROLLERTEXTThe planner/planning group responsible for this material at this plant.
PLANNED_DELIVERY_DAYSNUMBERPlanned delivery time (PLIFZ) in calendar days — PO creation to goods receipt.
GR_PROCESSING_DAYSNUMBERGoods-receipt processing time in calendar days after physical receipt.
TOTAL_INBOUND_LT_DAYSNUMBERplanned_delivery_days + gr_processing_days. NULL only when both components are NULL.
SAFETY_STOCKNUMBERSafety stock quantity. Sparse — populated on only ~1.1% of rows (55,418 of 56,060 are zero/NULL); any safety-stock analysis covers a sliver of the portfolio.
REORDER_POINTNUMBERReorder point quantity. Also sparse.
MOQNUMBERMinimum order quantity from vendor/MRP planning.
MIN_ORDER_QTYNUMBERAlternative minimum-order-quantity field; may overlap with MOQ depending on configuration.
MAX_ORDER_QTYNUMBERMaximum order quantity per replenishment cycle.
PROCUREMENT_TYPETEXTE=external procurement, F=in-house production, X=both.
SPECIAL_PROCUREMENT_KEYNUMBERRefines procurement type (e.g. subcontracting, consignment, stock transfer).
MATERIAL_STATUSTEXTPlant-level material status controlling which transactions are allowed.
MATERIAL_STATUS_VALID_FROMDATEEffective date of the plant-level status.
PURCHASING_GROUPTEXTThe buyer/buying team responsible for procuring this material at this plant.
TOTAL_REPLENISHMENT_LT_DAYSNUMBERTotal replenishment lead time from SAP (may differ from total_inbound_lt_days when SAP stores an overridden total directly).
LOT_SIZE_PROCEDURETEXTMRP lot-sizing procedure code (e.g. EX=exact quantity, FX=fixed lot, MB=monthly).
COSTING_LOT_SIZE_QTYNUMBERCosting lot size, used for unit-cost calculations, not MRP order sizing.
APO_RELEVANTBOOLEANTRUE = active in an SAP APO/IBP integration model.
APO_RELEVANT_FLAG_RAWNUMBERRaw SAP code before mapping to TRUE/FALSE, preserved for lineage.
PROFIT_CENTERTEXTSAP profit center for this material+plant.
ABC_CLASSIFICATIONTEXTA=high-value/high-volume, B=medium, C=low. 40.1% NULL — not run/maintained for all material-plants.
APO_TYPETEXTAPO/IBP planning type or model category.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
BRIDGE_SUPPLIER_MATERIAL — 7 columns

Grain: One row per manufacturer-material-plant combination (4,855 rows)
Primary key: SUPPLIER_SK, MATERIAL_12NC, PLANT_CODE
Source: Manufacturer key per material from the demand-planning source

Which manufacturer supplies which material, at which plant. Plant is required in the grain — 57 materials have genuinely different manufacturers per plant, and omitting plant caused 315 phantom relationships when this was first built material-only.

ColumnTypeBusiness Meaning
SUPPLIER_SKTEXTPart of composite PK. FK → DIM_SUPPLIER_SOURCE (DEMAND_MANUFACTURER namespace).
SOURCE_SUPPLIER_IDTEXTRaw manufacturer key from the demand-planning source.
MATERIAL_12NCTEXTPart of composite PK. FK → DIM_MATERIAL.
PLANT_CODETEXTPart of composite PK. Required in the grain — 57 materials have different manufacturers per plant.
SUPPLIER_NAMETEXTManufacturer display name.
IS_FIRST_IN_CHAINBOOLEANAlways TRUE in this table — indicates the primary (first-tier) manufacturer. Reserved for future multi-tier relationships.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.

Facts — Inventory, Demand & Purchasing (6 tables)

FACT_INVENTORY — 20 columns

Grain: Material × plant × storage location × stock type × fiscal period, repeating monthly snapshot (1,655,310 rows)
Primary key: INVENTORY_SK
Source: STG_INVENTORY

On-hand and goods-in-transit stock position. REPEATING MONTHLY SNAPSHOT — always filter to a specific fiscal period, or a query silently sums every month ever loaded. GIT rows carry stock_type IS NULL by definition. Value columns are worth a specific caveat: 38% of rows carry an individually-negative value even though quantity is positive — investigated live (2026-08-20) and confirmed to be inter-stock-type value reclassification pairs (e.g. one material showing -€386M on one stock type exactly offset by +€386M on another), the same accounting pattern already accepted for signed goods-movement quantities. Only trust the value summed across all stock types for a material+plant+period; a single stock-type slice can carry this reclass noise.

ColumnTypeBusiness Meaning
INVENTORY_SKTEXTSurrogate PK: hash of material+plant+storage_location+stock_type+fiscal_period.
MATERIAL_12NCTEXTFK → DIM_MATERIAL.
PLANT_CODETEXTFK → DIM_PLANT.
STORAGE_LOCATIONTEXTSAP storage location within the plant. NULL when the snapshot has no location split.
STOCK_TYPETEXTA=Unrestricted, Q=Quality Inspection, D=Blocked/Damaged, plus other SAP categories. GIT rows carry NULL. Always filter stock_type='A' for available-stock analysis.
STOCK_TYPE_DESCTEXTHuman-readable stock-type description.
IS_UNRESTRICTEDBOOLEANTRUE when stock_type='A'. Quick filter for available-stock queries.
MRP_CONTROLLERTEXTMRP controller carried through from the inventory source.
FISCAL_PERIOD_CODETEXTFK → DIM_FISCAL_PERIOD.
CALENDAR_MONTH_KEYTEXTISO date string derived from fiscal_period_code.
FISCAL_YEARNUMBERCalendar year of the snapshot.
FISCAL_PERIOD_NUMNUMBERCalendar month number (1–12).
ON_HAND_QTYNUMBEROn-hand quantity at this storage_location+stock_type grain. SUM across stock types = total physical stock.
GIT_QTYNUMBERGoods-in-transit quantity.
TOTAL_QTY_INCL_GITNUMBERon_hand_qty + git_qty.
ON_HAND_VALUE_EURNUMBEROn-hand value. See the reclassification caveat above — trust only when summed across all stock types.
GIT_VALUE_EURNUMBERGoods-in-transit value.
TOTAL_VALUE_EURNUMBERTotal value including GIT. Same caveat as on_hand_value_eur.
ON_HAND_PCT_OF_TOTALNUMBERon_hand_qty / total_qty_incl_git. 93.1% NULL — deterministically NULL whenever total stock is 0 (most storage/stock-type combos in the repeating snapshot carry no stock at all).
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_DEMAND_FORECAST — 29 columns

Grain: Material × plant × month × key figure × source file × channel × planning account × ORU × MRU (246,026 rows)
Primary key: DEMAND_SK
Source: STG_DEMAND_FORECAST

Holds both the forward demand forecast (source_file=DEMAND_QXP) and actual sales (source_file=SALES_VIPP) in one long/pivoted table — never sum across both without filtering source_file. Similarly, forecast_quantity carries both plan and actuals split by category (plan vs. ACT_CY/ACT_CY-1) — never sum without filtering category, or plan and actuals get silently added together. material_12nc mixes real 14-digit product codes with non-canonical planning-aggregate keys that have no inventory records (95.99% of total demand volume comes from just 73 aggregate keys) — check is_aggregate_key before joining to inventory.

ColumnTypeBusiness Meaning
DEMAND_SKTEXTSurrogate PK, unique per full planning grain.
MATERIAL_12NCTEXTFK → DIM_MATERIAL. May be a real 14-digit code or a planning aggregate key.
IS_AGGREGATE_KEYBOOLEANTRUE when material_12nc is a non-canonical planning aggregate key. Filter FALSE for shortage/inventory analysis.
PLANT_CODETEXTFK → DIM_PLANT.
CALENDAR_MONTH_KEYTEXTFK → DIM_FISCAL_PERIOD.
FISCAL_PERIOD_CODETEXTYYYYPPP, resolved from calendar_month_key.
FISCAL_YEARNUMBERCalendar year of the planning period.
KEY_FIGURETEXTAPO/IBP key figure name (e.g. Qty, Value, DP_FCST).
CATEGORYTEXTACT_CY = current-year actuals, ACT_CY-1 = prior-year actuals, NULL = pure forecast rows.
MEASURE_TYPETEXTQUANTITY or VALUE_EUR. Never sum the two together.
FORECAST_QUANTITYNUMBERPlanned OR actual quantity — split by category. Negative values (0.17% of rows) are expected and correct: sales returns/credit reversals, never on plan rows.
FORECAST_VALUE_EURNUMBERPlanned or actual value in EUR.
CURRENCYTEXTAlways EUR in this dataset.
ORU_KEYNUMBEROperating Reporting Unit key.
MRU_KEYTEXTMarket Reporting Unit key, pairs with ORU_KEY.
BG_CODETEXTBusiness Group code carried from the forecast source.
BU_CODETEXTBusiness Unit code. Join to the BU dimension for names.
CHANNEL_GROUPTEXTSales channel group. Part of the grain.
PLANNING_ACCOUNTTEXTCustomer/account planning key. Joins to the delivery and sales-order facts.
SOURCE_SUPPLIER_IDTEXTAPO manufacturer key. Joins to the supplier dimension (DEMAND_MANUFACTURER namespace).
ATO_ETO_FLAGTEXTConfigure-to-order flag.
LIFECYCLE_PHASETEXTLifecycle phase at the time of the forecast snapshot.
SUPPLY_CLASSTEXTSupply classification at snapshot time.
SEGMENTTEXTMarket segment attribute.
MRP_CONTROLLERTEXTMRP controller from the demand source.
FIN_POST_INDTEXTFinance posting indicator.
COMMERCIAL_SUB_TEAMTEXTCommercial sub-team.
SOURCE_FILETEXTDEMAND_QXP = forecast export, SALES_VIPP = actual sales. Always filter on this.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_FORECAST_PERFORMANCE — 33 columns

Grain: Material × planning account × fiscal period × distribution channel (62,509 rows)
Primary key: FCST_PERF_SK
Source: STG_FORECAST_BIAS

Forecast bias/accuracy tracking with successive forecast snapshots at N, N-1, N-2, N-3 lags compared to actuals. Distribution channel is part of the grain — without it, 1,527 (material, account, period) combinations collided across different channels.

ColumnTypeBusiness Meaning
FCST_PERF_SKTEXTSurrogate PK.
MATERIAL_12NCTEXTFK → DIM_MATERIAL.
PLANNING_ACCOUNTTEXTCustomer/account planning key. Part of the grain.
DISTRIBUTION_CHANNELTEXTSAP distribution channel code. Part of the grain.
DISTRIBUTION_CHANNEL_DESCTEXTChannel description.
SCM_AREA_CODETEXTCountry-level SCM area code. This whole fact is already 100% US (single value).
FISCAL_PERIOD_CODETEXTFK → DIM_FISCAL_PERIOD.
CALENDAR_MONTH_KEYTEXTISO date string.
FISCAL_YEARNUMBERCalendar year.
FISCAL_PERIOD_NUMNUMBERCalendar month number.
BGTEXTBusiness Group code, sourced from FC_BIAS as-is.
BUTEXTBusiness Unit code, sourced from FC_BIAS as-is.
MAGTEXTMarket and Application Group code — available here, unlike the demand-forecast fact.
PLANNED_QTY_N3NUMBERForecast quantity locked 3 months before the reporting period.
PLANNED_QTY_N2NUMBERForecast quantity locked 2 months before.
PLANNED_QTY_N1NUMBERForecast quantity locked 1 month before.
PLANNED_QTY_NNUMBERForecast quantity for the current reporting period.
ACTUAL_DELIVERED_QTYNUMBERActual delivered quantity. Denominator for accuracy/bias below.
ABS_DEV_N3NUMBERAbsolute deviation between planned_qty_n3 and actual (unsigned).
ABS_DEV_N2NUMBERAbsolute deviation at N-2 lag.
ABS_DEV_N1NUMBERAbsolute deviation at N-1 lag.
ABS_DEV_N0NUMBERAbsolute deviation for the current period, |planned_qty_n - actual|.
PLANNED_QXP_N3NUMBERMonetary planned value (Qty×Price) at N-3 lag.
PLANNED_QXP_N2NUMBERMonetary planned value at N-2 lag.
PLANNED_QXP_N1NUMBERMonetary planned value at N-1 lag.
PLANNED_QXP_NNUMBERMonetary planned value at current period.
CF_ABS_DEV_N3NUMBERCustomer-facing absolute deviation at N-3 lag.
CF_ABS_DEV_N2NUMBERCustomer-facing absolute deviation at N-2 lag.
CF_ABS_DEV_N1NUMBERCustomer-facing absolute deviation at N-1 lag.
CF_ABS_DEV_N0NUMBERCustomer-facing absolute deviation, current period.
FORECAST_ACCURACY_NNUMBER1 - ABS(abs_dev_n0)/actual_delivered_qty. NULL when actual=0. Denominator changed from planned_qty_n specifically to fix 65.5% of rows going NULL when plan was zero.
FORECAST_BIAS_PCTNUMBER(planned_qty_n - actual)/actual. Positive = over-forecast, negative = under-forecast. Computed from signed difference, not the unsigned deviation field.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_PURCHASE_ORDER_LINE — 40 columns

Grain: One row per PO number + item (12,063 rows)
Primary key: PO_SK
Source: STG_PO

Purchase-order line with ordered/received/open quantity, value, actual-vs-planned lead time, and vendor. Two distinct vendor identities are exposed side by side: DC (distribution-center) supplier — the actual PO counterparty — and EP (enterprise/manufacturer) supplier — the upstream manufacturer. Positive supply_delay_days = late.

ColumnTypeBusiness Meaning
PO_SKTEXTSurrogate PK, referenced by the schedule, confirmation, and goods-movement facts.
PO_NUMBERTEXTSAP purchase order number.
PO_ITEMTEXTSAP PO line item number.
MATERIAL_12NCTEXTFK → DIM_MATERIAL.
PLANT_CODETEXTReceiving plant. FK → DIM_PLANT.
SUPPLIER_SKTEXTFK → DIM_SUPPLIER_SOURCE, keyed on the DC vendor.
DC_SUPPLIER_IDTEXTSAP vendor number of the DC supplier, the formal PO counterparty.
DC_SUPPLIER_NAMETEXTDC supplier name. Resolves to the literal text 'Unknown Vendor' (not NULL) for the 16 lines with no source supplier ID.
DC_SUPPLIER_COUNTRYTEXTDC supplier country.
EP_SUPPLIER_IDTEXTSAP vendor number of the EP (manufacturer) supplier upstream of the DC. NULL = domestic replenishment; populated = import with a linked external order — this NULL carries real meaning, don't fill it.
EP_SUPPLIER_NAMETEXTEP supplier name.
EP_SUPPLIER_COUNTRYTEXTEP supplier country.
VENDOR_CATEGORYTEXTBusiness category of the DC supplier.
PO_TYPETEXTSAP PO document type (e.g. NB=standard PO, LP=scheduling agreement).
BG_CODETEXTBusiness Group code from the PO source.
BU_CODETEXTBusiness Unit code from the PO source.
MRU_KEYTEXTMatches mru_key in the demand-forecast fact.
ORU_KEYNUMBERMatches oru_key in the demand-forecast fact.
ORDERED_QTYNUMBEROriginal ordered quantity.
ORDERED_UOMTEXTUnit of measure for ordered_qty.
RECEIVED_QTYNUMBERQuantity received to date.
OPEN_QTYNUMBERGREATEST(ordered_qty - COALESCE(received_qty,0), 0).
OVER_DELIVERED_QTYNUMBERGREATEST(received_qty - ordered_qty, 0) — the over-delivery signal that flooring open_qty at 0 would otherwise destroy.
IS_OVER_DELIVEREDBOOLEANTRUE when received_qty > ordered_qty.
PO_VALUE_EURNUMBERPO line value in EUR.
REPORTING_CURRENCYTEXTAlways 'EUR' — pairs with po_value_eur so it's never mistaken for the document currency.
PO_VALUE_LOCALNUMBERPO line value in its original document currency.
CURRENCYTEXTOriginal document currency of po_value_local.
PO_RELEASE_DATEDATEPO release/creation date.
PLANNED_DELIVERY_DATEDATEOriginally planned delivery date.
CONFIRMED_DELIVERY_DATEDATEVendor-confirmed expected delivery date.
REQUESTED_PDT_DAYSNUMBERRequested lead time in days, agreed at PO creation.
ACTUAL_GR_DATEDATEActual goods-receipt date.
SUPPLY_DELAY_DAYSNUMBERactual GR minus requested date. Positive = late, negative = early — this is the basis for on-time/vendor performance metrics.
ACTUAL_TOTAL_LT_DAYSNUMBERActual elapsed days, PO release to goods receipt.
MARC_PLANNED_LT_DAYSNUMBERPlanned lead time from the material-plant master data.
IS_DELAYEDBOOLEANTRUE when supply_delay_days > 0.
IS_SIGNIFICANTLY_DELAYEDBOOLEANTRUE when supply_delay_days > 14 days.
IS_FULLY_RECEIVEDBOOLEANTRUE when received_qty ≥ ordered_qty.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_PO_SCHEDULE — 14 columns

Grain: One row per PO/item/schedule line — SAP EKET (12,063 rows)
Primary key: PO_SCHEDULE_SK
Source: STG_PO

SAP delivery-schedule (call-off) lines for standard purchase orders, with scheduled delivery date and quantity.

ColumnTypeBusiness Meaning
PO_SCHEDULE_SKTEXTSurrogate PK: hash of po_number|po_item|schedule_line.
PO_NUMBERTEXTFK → FACT_PURCHASE_ORDER_LINE.
PO_ITEMTEXTCombine with po_number for the natural EKET key.
SCHEDULE_LINETEXTSAP schedule line number (ETENR) — distinguishes multiple delivery dates within one PO item.
PO_SKTEXTFK → FACT_PURCHASE_ORDER_LINE.
MATERIAL_12NCTEXTResolved from the PO-line fact. FK → DIM_MATERIAL.
PLANT_CODETEXTResolved from the PO-line fact. FK → DIM_PLANT.
SUPPLIER_SKTEXTFK → DIM_SUPPLIER_SOURCE, resolved from the PO-line fact.
SOURCE_SUPPLIER_IDTEXTDC supplier ID, resolved from the PO-line fact.
SCHEDULED_DELIVERY_DATEDATEExpected delivery date for this schedule line.
SCHEDULED_QTYNUMBERQuantity scheduled on this line.
RECEIVED_QTY_TO_SCHEDULENUMBERQuantity already received against this specific schedule line.
OPEN_SCHEDULE_QTYNUMBERGREATEST(scheduled_qty - received_qty_to_schedule, 0).
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_PO_CONFIRMATION — 15 columns

Grain: One row per PO/item/confirmation sequence/type — SAP EKES (20,687 rows)
Primary key: PO_CONFIRM_SK
Source: STG_PO

Vendor confirmations (order acknowledgements, shipping notifications) against a PO, tracked separately from actual receipts to measure vendor responsiveness.

ColumnTypeBusiness Meaning
PO_CONFIRM_SKTEXTSurrogate PK. Includes confirmation_type in the grain — AB and LA types share the same (PO, item, seq) and would otherwise merge incorrectly.
PO_NUMBERTEXTFK → FACT_PURCHASE_ORDER_LINE.
PO_ITEMTEXTCombine with po_number to join to the PO-line fact.
CONFIRMATION_SEQTEXTSAP confirmation sequence — a vendor may submit multiple confirmations per PO+item.
CONFIRMATION_TYPETEXTAB = order acknowledgement (vendor accepts), LA = shipping notification (vendor dispatched). Part of the PK.
CONFIRMATION_CREATION_INDICATORTEXTSAP status/creation indicator, not the AB/LA type. Kept for lineage only.
MATERIAL_12NCTEXTResolved from the PO-line fact.
PLANT_CODETEXTResolved from the PO-line fact.
SUPPLIER_SKTEXTFK → DIM_SUPPLIER_SOURCE (DC supplier).
SOURCE_SUPPLIER_IDTEXTDC supplier ID, resolved from the PO-line fact.
CONFIRMED_DELIVERY_DATEDATEVendor-confirmed expected delivery date.
CONFIRMED_QTYNUMBERTotal quantity vendor confirmed. Gross before any reduction.
REDUCED_QTYNUMBERQuantity already consumed/reduced against this confirmation.
OPEN_CONFIRMED_QTYNUMBERGREATEST(confirmed_qty - COALESCE(reduced_qty,0), 0).
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_GOODS_MOVEMENT — 18 columns

Grain: One row per PO/item/accounting-doc/fiscal-year/doc-line/transaction-type/movement-type — SAP EKBE (14,777 rows)
Primary key: GOODS_MOVEMENT_SK
Source: STG_PO history extract

Goods-receipt history against purchase orders (movement types 101=GR, 102=reversal, 107/108=blocked-stock in/out, 161/162=return/reversal). Quantities and values are signed by the SAP debit/credit indicator, not by a hardcoded movement-type list — this correctly makes returns/reversals reduce the running total.

ColumnTypeBusiness Meaning
GOODS_MOVEMENT_SKTEXTSurrogate PK. Full SAP composite key required — PO+item+doc alone is not unique across fiscal years/doc lines.
PO_NUMBERTEXTFK → FACT_PURCHASE_ORDER_LINE.
PO_ITEMTEXTCombine with po_number to join to the PO-line fact.
PO_SKTEXTFK → FACT_PURCHASE_ORDER_LINE.
MATERIAL_12NCTEXTResolved from the PO-line fact.
PLANT_CODETEXTResolved from the PO-line fact.
POSTING_DATEDATEAccounting posting date — the date the movement was financially recorded.
MOVEMENT_TYPENUMBER101=GR against PO, 102=GR reversal, 107=GR to blocked stock, 108=GR from blocked stock, 161=return to supplier, 162=return reversal.
FISCAL_YEAR_SAPTEXTSAP fiscal year of the accounting document. Part of the PK — the doc number is only unique within a fiscal year.
DOCUMENT_LINETEXTSAP accounting document line item. Part of the PK.
TRANSACTION_TYPENUMBERSAP transaction/event type, refining the movement type. Part of the PK.
GR_QTY_NETNUMBERNet goods-receipt quantity, signed (S=positive receipt, H=negative return/reversal). Sign comes from the debit/credit field, not the movement-type code.
GR_QTY_RAWNUMBERRaw unsigned quantity before sign application.
GR_VALUE_LCNUMBERGoods-movement value in local currency, signed by debit/credit.
CURRENCYTEXTLocal/document currency of the posting.
BATCHTEXTSAP batch number, when batch management is active.
DEBIT_CREDITTEXTS=debit (stock increases), H=credit (stock decreases). Drives the signed quantity/value columns above.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_INBOUND_SUPPLY_EVENT — 12 columns

Grain: One row per open inbound supply signal per PO/item (150 rows)
Primary key: INBOUND_EVENT_SK
Source: Derived from FACT_PO_SCHEDULE and FACT_PO_CONFIRMATION

Unifies two different signal types into one inbound-supply timeline: EKET delivery-schedule lines (standard POs with no open vendor confirmation) and EKES vendor confirmations (which override the schedule line for the same PO+item when they carry open quantity). Feeds the supply-position projection below. Past-due dates are rolled forward to the data-anchor month so overdue open supply isn't dropped from the position calculation, and eligible quantity is capped pro-rata to the PO line's own open_qty to prevent stale/over-consumed confirmations from overstating future supply.

ColumnTypeBusiness Meaning
INBOUND_EVENT_SKTEXTSurrogate PK.
PO_NUMBERTEXTFK → FACT_PURCHASE_ORDER_LINE.
PO_ITEMTEXTCombine with po_number to join to the PO-line fact.
CONFIRMATION_SEQTEXTEKES confirmation sequence. NULL for EKET-sourced signals.
SIGNAL_SOURCETEXTEKET = delivery schedule line, EKES = vendor confirmation (overrides EKET when it carries open quantity).
CONFIRMATION_TYPETEXTAB/LA, propagated from the confirmation fact. NULL for EKET signals.
EXPECTED_DELIVERY_DATEDATEExpected arrival date. Past-due dates are rolled forward to the anchor month.
ELIGIBLE_QTYNUMBEROpen inbound quantity eligible to cover demand. Capped pro-rata to the PO line's own open_qty.
MATERIAL_12NCTEXTResolved from the PO-line fact.
PLANT_CODETEXTResolved from the PO-line fact.
SUPPLIER_SKTEXTFK → DIM_SUPPLIER_SOURCE (DC supplier).
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.

Facts — Delivery, Slow-Moving & Supply-Risk (5 tables)

FACT_DELIVERY — 67 columns

Grain: One row per sales-order-line/delivery-line (756,429 rows)
Primary key: DELIVERY_SK
Source: STG_DRM

The DRM (Delivery Reliability Management) scoring fact. drm_pct=100 for a reliable line, 0 for a missed line; is_drm_miss=1 when missed. Carries a bank of 17 MISSED_* reason-bucket flags — a specific reason always wins over that tier's generic 'other' bucket when both apply. DRM scoring excludes rejected/cancelled lines and lines with an unmeasurable delay figure. rejection_reason_code being NULL is a valid, normal state (no rejection occurred), not a data gap.

ColumnTypeBusiness Meaning
DELIVERY_SKTEXTSurrogate PK.
SO_SKTEXTFK → FACT_SALES_ORDER_LINE.
SALES_ORDER_NUMBERTEXTSales order document number.
SALES_ORDER_ITEMTEXTSales order line item.
DELIVERY_NUMBERTEXTDelivery document number. 3.16% NULL — undelivered lines have no delivery document yet.
DELIVERY_ITEMTEXTDelivery line item.
MATERIAL_12NCTEXTFK → DIM_MATERIAL.
PLANT_CODETEXTFulfilling plant. FK → DIM_PLANT.
CUSTOMER_IDTEXTShip-to customer. FK → DIM_CUSTOMER.
SHIP_TO_COUNTRYTEXTShip-to country on this delivery line.
SOLD_TO_IDTEXTSold-to (billing) party.
BU_CODETEXTBusiness Unit code. FK → DIM_BUSINESS_UNIT_BYCODE.
BG_KEYTEXTBusiness Group code from DRM.
AG_CODETEXTArticle group code.
AG_NAMETEXTArticle group name.
CAG_CODENUMBERCustomer Account Group code.
BANNERTEXTRetail banner/key account.
PLANNING_ACCOUNTTEXTJoins to the demand-forecast fact for demand-to-order reconciliation.
MRP_CONTROLLERTEXTMRP controller from the DRM source.
SO_CREATION_DATEDATESales order creation date.
CUSTOMER_REQUESTED_DATEDATECustomer requested/agreed delivery-promise date.
BEST_CONFIRMED_DELIVERY_DATEDATEBest confirmed delivery date.
ACTUAL_DELIVERY_DATEDATEActual delivery date. 3.22% NULL — not yet delivered.
ACTUAL_GOODS_ISSUE_DATEDATEActual goods-issue date. 3.24% NULL — not yet issued.
APPOINTMENT_DATEDATEAppointment date. 95.3% NULL — only appointment-based deliveries carry this.
MAX_APPOINTMENT_DATEDATELatest scheduled appointment date.
DELIVERY_AGREED_QTYNUMBERAgreed (promised) delivery quantity.
DELIVERY_ACTUAL_QTYNUMBERActual delivered quantity.
PRIMARY_DELAY_REASONTEXTPrimary miss reason, derived from the MISSED_* buckets. NULL for on-time lines (95.7% NULL, by design).
DELAY_REASON_GROUPTEXTReason group (Supply/Sales/Outbound/Other).
ER_REASON_CODETEXTException-report root cause. 100% NULL — empty in source, structural gap.
SOR_REASON_CODETEXTSchedule-of-record root cause. 99.98% NULL — empty in source.
DELAY_DAYS_ADPNUMBERAgreed-delivery-promise delay in days on a miss. Positive = late.
IS_ADP_UNMEASURABLEBOOLEANTRUE when the delay figure can't be measured (missing dates). Exclude when averaging.
ITEM_CATEGTEXTSales order item category.
DRM_PCTNUMBERDRM reliability percentage for the line. 100=reliable, 0=missed.
DRM_TOTAL_LINESNUMBERLines eligible for DRM scoring (always 1 per row).
DRM_SCORED_LINESNUMBER1 if scored as reliable, 0 if missed — the additive numerator for DRM%.
SOR_TOTAL_LINESNUMBERSame eligibility pattern for SOR scoring.
SOR_SCORED_LINESNUMBERSOR success numerator.
ER_TOTAL_LINESNUMBERSame eligibility pattern for ER scoring.
ER_SCORED_LINESNUMBERER success numerator.
IS_DRM_MISSNUMBER1 when the line was missed. NULL = excluded from scoring (unmeasurable/rejected) — this NULL is the eligibility contract, not a gap.
DRM_FLAGNUMBER1 when the line is DRM-reliable.
DRM_EXCLUSION_REASONTEXTPopulated only for lines excluded from scoring.
DRM_SEGMENT_NOTETEXTAnnotation for ADP-unmeasurable/rejected lines that are now scored rather than excluded (2026-08-17 pipeline change).
SOR_FLAGNUMBER1 when SOR data exists for this line.
ER_FLAGNUMBER1 when ER data exists for this line.
MISSED_NO_STOCK, MISSED_SUPPLY_REASON_FOR_REJ, MISSED_SUPPLY_DELIVERY_BLOCK, MISSED_DEL_GROUP, MISSED_SUPPLY_OTHERSNUMBERSupply-tier miss-reason indicators (5 columns).
MISSED_CREDIT_BLOCK, MISSED_SALES_DELIVERY_BLOCK, MISSED_SALES_REASON_FOR_REJ, MISSED_INCOMPLETE_ORDER, MISSED_INCONSISTENT_DATA, MISSED_SALES_EX_CREDIT_MISCNUMBERSales-tier miss-reason indicators (6 columns).
MISSED_TRANSPORT, MISSED_WAREHOUSE, MISSED_APPOINTMENT_CALLS, MISSED_WRONG_DAY, MISSED_OUTBOUND_EX_WAREHOUSE_TRANSPORTNUMBEROutbound-tier miss-reason indicators (5 columns).
MISSED_MISCNUMBERCatch-all miss indicator.
MISSED_UNATTRIBUTEDNUMBER1 when the line is a DRM miss and none of the 17 coded flags is set.
COMPLETE_DELIVERY_REQUIRED_FLAGTEXTWhether the order was configured to require complete delivery (a requirement setting, not proof of fulfillment).
IS_DELIVERY_COMPLETEBOOLEANActual-outcome flag: TRUE when delivered qty met/exceeded agreed qty. Use this, not the flag above, for 'was it actually fulfilled complete'.
APPOINTMENT_FLAGTEXTAppointment flag.
CARRIERTEXTCarrier. 100% NULL — structural capability gap, never populated in this extract.
SHIPMENT_TMS_IDTEXTTransport-management shipment ID. 100% NULL — same structural gap.
LAST_CARRIER_STATUSTEXTLast carrier status. 100% NULL — same structural gap.
REJECTION_REASON_CODETEXTSAP rejection code. NULL when not rejected (a normal state, not a gap).
REJECTION_REASON_LABELTEXTDisplay-ready rejection reason.
REJECTION_REASON_DESCTEXTRejection reason description.
DELIVERY_BLOCK_CODETEXTDelivery block code. NULL = not blocked (a normal state).
DELIVERY_BLOCK_DESCTEXTDelivery block description.
OVERALL_DELIVERY_STATUSTEXTDerived status: 'C' (completed) when an actual delivery date exists.
REJECTION_STATUSTEXTDerived status: 'REJECTED' when a rejection reason is present.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_SALES_ORDER_LINE — 36 columns

Grain: One row per sales order line (756,429 rows)
Primary key: SO_SK
Source: STG_DRM

Order-status, open-quantity, OTIF, and fill-rate view of the same underlying DRM data as FACT_DELIVERY, at sales-order-line grain. open_qty respects rejection/cancellation/block status — a rejected line's open quantity is 0, not the unfulfilled remainder.

ColumnTypeBusiness Meaning
SO_SKTEXTSurrogate PK.
SALES_ORDER_NUMBERTEXTSales order document number.
SALES_ORDER_ITEMTEXTSales order line item.
MATERIAL_12NCTEXTFK → DIM_MATERIAL.
PLANT_CODETEXTFulfilling plant. FK → DIM_PLANT.
CUSTOMER_IDTEXTShip-to customer.
SOLD_TO_IDTEXTSold-to party.
BU_CODETEXTBusiness Unit code.
BG_KEYTEXTBusiness Group code.
PLANNING_ACCOUNTTEXTCustomer/account planning key.
AG_CODE, AG_NAMETEXTArticle group code and name.
CAG_CODENUMBERCustomer Account Group code.
BANNERTEXTRetail banner/key account.
SO_CREATION_DATEDATESales order creation date.
CUSTOMER_REQUESTED_DATEDATECustomer requested delivery date.
BEST_CONFIRMED_DELIVERY_DATEDATEBest confirmed delivery date.
ACTUAL_DELIVERY_DATEDATEActual delivery date. NULL = not yet delivered.
ACTUAL_GOODS_ISSUE_DATEDATEActual goods-issue date.
APPOINTMENT_DATE, MAX_APPOINTMENT_DATEDATEAppointment window dates, conditional (only appointment-based deliveries).
ORDERED_QTYNUMBEROrdered quantity on the SO line.
DELIVERED_QTYNUMBERDelivered quantity.
OPEN_QTYNUMBEROpen (undelivered) quantity; 0 for rejected/complete/cancelled lines.
ORDER_STATUSTEXTOPEN / PARTIAL / COMPLETE / REJECTED / BLOCKED.
DELIVERY_BLOCK_CODE, DELIVERY_BLOCK_DESCTEXTDelivery block on the SO line.
REJECTION_REASON_DESCTEXTRejection reason on the SO line.
DELIVERY_DELAY_DAYSNUMBERActual delivery minus requested date. Positive = late. This is SO-line lateness — for miss-lateness use FACT_DELIVERY.delay_days_adp.
IS_ON_TIMEBOOLEANTRUE when delivered on/before requested date. NULL when not yet delivered — never defaulted to FALSE, which would wrongly assert 'late'.
PRIMARY_DELAY_REASON, DELAY_REASON_GROUPTEXTDominant miss reason/group on the SO line.
IS_DRM_MISSNUMBER1 when this SO line was a DRM miss.
PRIMARY_ER_REASON_CODETEXT100% NULL — structural gap, ER data empty in source.
PRIMARY_SOR_REASON_CODETEXT99.98% NULL — SOR data empty in source.
COMPLETE_DELIVERY_REQUIRED_FLAGTEXTConfiguration flag, not an outcome measure.
IS_DELIVERY_COMPLETEBOOLEANActual-outcome fulfillment flag.
APPOINTMENT_FLAGTEXTAppointment flag.
PRIMARY_CARRIER, LAST_CARRIER_STATUSTEXT100% NULL — structural carrier-data gap.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
FACT_SLOW_MOVING_INVENTORY — 32 columns

Grain: Material × plant × calendar month, repeating monthly snapshot (72,110 rows)
Primary key: SMI_SK
Source: STG_SLOW_MOVING

Aging-bucket inventory view (0-6mo / 7-12mo / >12mo) for slow-moving and dead-stock analysis. Holds both Active and No-demand rows since a 2026-08-18 pipeline fix. Client definition: healthy = 0-6 months, slow-moving = 6+ months (7-12M + >12M combined). GIT_QTY here uses a NULL-when-absent convention, unlike FACT_INVENTORY's 0-when-absent — a known, documented inconsistency, not yet resolved.

ColumnTypeBusiness Meaning
SMI_SKTEXTSurrogate PK.
MATERIAL_12NCTEXTFK → DIM_MATERIAL.
PLANT_CODETEXTFK → DIM_PLANT.
CALENDAR_MONTH_YYYYMMTEXTSource period format.
CALENDAR_MONTH_KEYTEXTISO date string. Part of the PK.
FISCAL_PERIOD_CODETEXTResolved via DIM_FISCAL_PERIOD.
FISCAL_YEARNUMBERCalendar year of the snapshot.
ON_HAND_QTYNUMBERTotal on-hand at month-end. Includes all aging buckets.
ON_HAND_VALUENUMBERTotal on-hand stock value at month-end.
GIT_QTY, GIT_VALUENUMBERGoods-in-transit quantity/value. 71.3% NULL — different convention from FACT_INVENTORY's 0-default, a known open item.
QTY_0_6MNUMBERStock aged 0-6 months — the healthy-stock definition.
QTY_7_12MNUMBERStock aged 7-12 months.
QTY_GT_12MNUMBERStock aged >12 months — the primary dead-stock indicator.
VALUE_7_12M, VALUE_GT_12MNUMBERValue of the 7-12M and >12M aging buckets.
SLOW_MO_QTY, SLOW_MO_VALUENUMBERQTY_7_12M + QTY_GT_12M and its value — the 'slow-moving = 6+ months' client definition.
HEALTHY_QTYNUMBERAlias of QTY_0_6M — the 'healthy' definition.
CURRENT_QTY, PRIOR_MONTH_QTYNUMBERCurrent vs. prior-month quantity. NULL on a material's first appearance (no prior month exists) — structural, not a defect.
QTY_MOM_DELTANUMBERMonth-over-month change. Negative = stock fell (correct by design).
CURRENT_VALUE, PRIOR_MONTH_VALUE, VALUE_MOM_DELTANUMBERSame current/prior/delta pattern for value.
SMOS_MONTH_COUNTNUMBERConsecutive months flagged slow-moving. 96.67% NULL — only measured for a subset; currently a NULL here defaults is_chronic_slow_mover to FALSE, an open question (does NULL mean zero months or not-measured?).
BG_CODE, BU_CODENUMBER/TEXTBusiness group/unit code from the slow-moving source.
MAG_CODE, MAG_NAMETEXTMarket and Application Group code/name.
LIFECYCLE_PHASETEXTProduct lifecycle phase at snapshot time.
ORU_KEY, MRU_KEYNUMBER/TEXTOperating/Market Reporting Unit keys.
SOURCE_MANUFACTURER_IDNUMBERManufacturer ID from the slow-moving source.
MRP_CONTROLLERTEXTMRP controller from the slow-moving source.
DEMAND_FLAGTEXTRaw source demand signal: 'no demand' or 'demand'.
DEMAND_CATEGORYTEXT'No demand this period' or 'Active' — the reporting label derived from demand_flag.
HAS_SLOW_STOCK_GT_12MBOOLEANTRUE when qty_gt_12m > 0.
IS_CHRONIC_SLOW_MOVERBOOLEANTRUE when smos_month_count ≥ 3. Use only for chronic/persistent questions, not the default slow-moving reading.
SLOW_MO_VALUE_PCTNUMBERSlow-moving value as % of total on-hand value, pre-computed at row grain.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
SUPPLY_POSITION_BY_DATE — 12 columns

Grain: One row per material-plant-date event (supply arrival, demand due-date, or the anchor snapshot date) (24,205 rows)
Primary key: MATERIAL_12NC, PLANT_CODE, POSITION_DATE
Source: Derived from FACT_INVENTORY, FACT_INBOUND_SUPPLY_EVENT, and FACT_SALES_ORDER_LINE

The projected supply-vs-demand balance timeline: for each material+plant, a row exists for the inventory-snapshot anchor date, each inbound-event date, and each open-demand due date. Past-due dates are rolled forward to the anchor month so overdue supply/demand isn't dropped.

ColumnTypeBusiness Meaning
MATERIAL_12NCTEXTPart of composite PK. FK → DIM_MATERIAL.
PLANT_CODETEXTPart of composite PK. FK → DIM_PLANT.
POSITION_DATEDATEPart of composite PK. The date this row's supply-or-demand event occurs.
ON_HAND_QTYNUMBEROn-hand (unrestricted) stock at the latest snapshot, carried forward at the anchor row — the opening stock for the position calculation.
INVENTORY_RECORD_AVAILABLEBOOLEANTRUE when an actual inventory snapshot exists. FALSE means on_hand_qty is assumed 0 (no snapshot exists) — distinguishes genuine zero-stock from missing data.
ELIGIBLE_INBOUND_QTYNUMBERInbound supply quantity arriving on this position_date.
OPEN_DEMAND_QTYNUMBERTotal open order demand due on this position_date.
CUMULATIVE_INBOUND_QTYNUMBERRunning total of eligible inbound supply up to and including this date.
CUMULATIVE_DEMAND_QTYNUMBERRunning total of open demand due up to and including this date.
CUMULATIVE_SUPPLY_AVAILABLENUMBERon_hand_qty + cumulative_inbound_qty. The key metric used to check whether demand due by a given date can be covered.
PROJECTED_BALANCE_QTYNUMBERcumulative_supply_available − cumulative_demand_qty. Negative = projected shortage — the table's entire purpose.
_LOAD_TSTIMESTAMP_LTZPipeline load timestamp.
SUPPLY_ORDER_IMPACT — 32 columns

Grain: One row per open sales-order line, anchored to a snapshot month (4,934 rows)
Primary key: SO_SK
Source: Derived from FACT_SALES_ORDER_LINE joined to inventory, inbound supply, and demand-forecast

Joins each open sales-order line to its available inventory, inbound POs, and 3-month forecast to identify at-risk orders. Not currently exposed via any of the four SEMANTIC v2 views — the delivery-outcome fields below being ~99.6% NULL likely reflects that this table holds mostly-open (undelivered) lines, but that hasn't been formally confirmed with the business. Many columns are explicitly flagged non-additive (repeated per order line, describing the shared material+plant position) — ORDER_QTY_AT_RISK is the one column safe to SUM across order lines.

ColumnTypeBusiness Meaning
DATA_ANCHOR_MONTHTEXTThe snapshot month this row's calculations are anchored to.
SO_SKTEXTFK → FACT_SALES_ORDER_LINE.
SALES_ORDER_NUMBER, SALES_ORDER_ITEMTEXTSales order identifiers.
MATERIAL_12NCTEXTFK → DIM_MATERIAL.
BRAND, PRODUCT_FAMILY, PRODUCT_CLASS, LIFECYCLE_PHASE, SUCCESSOR_12NCTEXT/NUMBERDenormalized material attributes.
PLANT_CODE, PLANT_NAME, PLANT_COUNTRYTEXTDenormalized plant attributes.
CUSTOMER_ID, SOLD_TO_ID, CUSTOMER_NAME, CUSTOMER_COUNTRYTEXTDenormalized customer attributes.
BU_CODE, BU_NAME, BANNER, AG_CODE, AG_NAME, CAG_CODETEXT/NUMBERDenormalized commercial hierarchy attributes.
SO_CREATION_DATE, CUSTOMER_REQUESTED_DATE, BEST_CONFIRMED_DELIVERY_DATE, ACTUAL_DELIVERY_DATEDATEOrder date milestones.
ORDERED_QTY, DELIVERED_QTY, OPEN_QTYNUMBEROrder quantity position.
ORDER_STATUS, DELIVERY_BLOCK_CODETEXTOrder status and block code.
DELIVERY_DELAY_DAYS, IS_ON_TIME, IS_DRM_MISSNUMBER/BOOLEANDelivery-outcome fields — ~99.6% NULL (open-line population).
PRIMARY_DELAY_REASON, DELAY_REASON_GROUPTEXTDelay reason, when known.
PRIMARY_ER_REASON_CODE, PRIMARY_SOR_REASON_CODE, PRIMARY_CARRIER, LAST_CARRIER_STATUSTEXT100% NULL — same structural gaps as the delivery fact.
AVAILABLE_INVENTORY_QTYNUMBER⚠ Non-additive. Unrestricted on-hand for this material+plant, repeated per order line.
GOODS_IN_TRANSIT_QTY, TOTAL_STOCK_QTYNUMBER⚠ Non-additive. GIT and total stock for this material+plant.
INVENTORY_AS_OF_PERIODTEXTFiscal period of the inventory snapshot used.
INVENTORY_RECORD_AVAILABLEBOOLEANTRUE when a real inventory record exists.
TOTAL_INBOUND_QTY, ON_TIME_INBOUND_QTY, DELAYED_INBOUND_QTYNUMBER⚠ Non-additive. Open PO quantity for this material+plant, split by expected timing.
NEAREST_INBOUND_DATEDATEEarliest confirmed delivery date across open POs for this material+plant.
MAX_SUPPLY_DELAY_DAYS, OPEN_PO_COUNTNUMBER⚠ Non-additive. Worst-case delay and open PO count for this material+plant.
SUPPLY_AVAILABLE_BY_DATENUMBEROn-hand + inbound arriving by the customer's required date, via an ASOF join to SUPPLY_POSITION_BY_DATE.
FORECAST_QTY_3M, FORECAST_MONTHS_COVEREDNUMBER⚠ Non-additive. 3-month forward forecast; months_covered flags when the '3-month' window is really narrower.
YTD_ACTUAL_SALES_QTYNUMBER⚠ Non-additive. Year-to-date actual sales for this material+plant. 76 rows carry a negative value — held pending a business decision on risk-scoring treatment.
TOTAL_LINES_SCORED, DRM_ON_TIME_LINES, DRM_PCT_COMPUTED, AVG_DRM_PCT, HISTORICAL_AVG_DELAY_DAYSNUMBER⚠ Non-additive. Historical DRM performance for this material+plant over a 6-month window.
MOST_COMMON_DELAY_REASON, MOST_COMMON_DELAY_GROUP, MOST_COMMON_ER_REASONTEXT⚠ Non-additive. Modal delay reason across historical DRM lines.
PLANNED_DELIVERY_DAYS, SAFETY_STOCK, MOQ, MRP_TYPE, PROCUREMENT_TYPENUMBER/TEXTDenormalized planning parameters from the material-plant bridge.
CUMULATIVE_OPEN_QTYNUMBERFIFO cumulative open demand up to this order, ordered by requested date then creation date.
CUMULATIVE_SHORTAGE_QTYNUMBERGREATEST(cumulative_open_qty - supply_available_by_date, 0). Do not sum across orders.
ORDER_QTY_AT_RISKNUMBERMarginal shortage attributed to this specific order. Safe to sum — correctly totals to the exact material+plant shortage.
SUPPLY_DELAY_FLAG, INVENTORY_SHORTAGE_FLAG, ORDER_AT_RISK_FLAGBOOLEANRisk flags — supply delayed / on-hand insufficient / total supply insufficient by required date.
IS_SLOW_MOVER, SMOS_MONTH_COUNT, SLOW_STOCK_GT_12M_QTYBOOLEAN/NUMBERSlow-moving context, joined from the latest slow-moving snapshot for this material+plant.

AGGREGATEPre-Computed KPI Tables

Thirteen tables, pre-joined and pre-computed from CURATED for reporting, dashboards, and fast natural-language query response.

AGG_FORECAST_PERFORMANCE_MATERIAL_MONTHLY — 21 columns, 13,390 rows

Grain: One row per material per fiscal month. Collapses planning-account and distribution-channel detail so most questions can be answered at material level directly.
Row count (live): 13,390
Built from (CURATED): FACT_FORECAST_PERFORMANCE

Material-level rollup of forecast planning quantities, actuals, bias, and MAD (Mean Absolute Deviation) at each forecast horizon.

ColumnTypeBusiness Meaning / Formula
MATERIAL_12NCTEXTMaterial identifier (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month for the period.
FISCAL_YEARNUMBERFiscal year of the period.
BU_CODETEXTBusiness unit, picked via MAX since a material rarely spans more than one BU.
PLANNED_QTY_N3_SUMNUMBERTotal forecast quantity planned at the N-3 horizon.
PLANNED_QTY_N2_SUMNUMBERTotal forecast quantity planned at the N-2 horizon.
PLANNED_QTY_N1_SUMNUMBERTotal forecast quantity planned at the N-1 horizon.
PLANNED_QTY_N0_SUMNUMBERTotal forecast quantity at the N-0 (most current/last-look) horizon.
ACTUAL_DELIVERED_QTY_SUMNUMBERTotal actual delivered quantity.
BIAS_RATIO_N3NUMBER(planned N-3 − actual) / actual. Signed, expressed as a 0–1 fraction. NULL when actuals are 0.
BIAS_RATIO_N2NUMBERSame formula at N-2.
BIAS_RATIO_N1NUMBERSame formula at N-1.
BIAS_RATIO_N0NUMBERSame formula at N-0.
MAD_N3NUMBERMean Absolute Deviation at N-3 — average of per-line absolute forecast error.
MAD_N2NUMBERMean Absolute Deviation at N-2.
MAD_N1NUMBERMean Absolute Deviation at N-1.
MAD_N0NUMBERMean Absolute Deviation at N-0.
VOLUME_GAP_QTY_N3NUMBERAbsolute volume gap at N-3 = planned − actual (units, not a ratio).
ROW_COUNTNUMBERNumber of underlying line-level rows collapsed into this material/month row.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_FORECAST_PERFORMANCE_BU_MONTHLY — 12 columns, 36 rows

Grain: One row per business unit per fiscal month. Sourced independently from the material-level table — MAPE must average each line's own ratio, not divide summed totals, or large- and small-volume materials mixing within a BU/period understates error.
Row count (live): 36
Built from (CURATED): FACT_FORECAST_PERFORMANCE

BU-level forecast error (MAPE) at each horizon.

ColumnTypeBusiness Meaning / Formula
BU_CODETEXTBusiness unit code (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
FISCAL_YEARNUMBERFiscal year.
MATERIAL_COUNTNUMBERDistinct materials contributing to the BU/period.
MAPE_N3NUMBERMean Absolute Percentage Error at N-3 = average, over rows with actual>0, of |deviation|/actual. Zero-actual rows excluded from both numerator and denominator.
MAPE_N2NUMBERSame MAPE formula at N-2.
MAPE_N1NUMBERSame MAPE formula at N-1.
MAPE_N0NUMBERSame MAPE formula at N-0.
MAPE_SCORED_ROWSNUMBERRows with actual > 0 that contributed to the MAPE calculation — a coverage indicator.
TOTAL_ROWSNUMBERTotal rows for the BU/period, including zero-actual rows excluded from MAPE.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_SLOW_MOVING_PRODUCT_FAMILY_MONTHLY — 16 columns, 753 rows

Grain: One row per product family × plant × fiscal month.
Row count (live): 753
Built from (CURATED): FACT_SLOW_MOVING_INVENTORY, DIM_MATERIAL

Product-family-level slow-moving and dead-stock rollup.

ColumnTypeBusiness Meaning / Formula
PRODUCT_FAMILYTEXTProduct family from the material dimension; unmatched materials roll up to a literal 'Unknown' bucket rather than being dropped.
PLANT_CODETEXTPlant code (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
MATERIAL_COUNTNUMBERDistinct materials contributing.
ON_HAND_QTY_SUMNUMBERTotal on-hand quantity.
ON_HAND_VALUE_SUMNUMBERTotal on-hand value.
QTY_7_12M_SUMNUMBERTotal quantity aged 7–12 months.
QTY_GT_12M_SUMNUMBERTotal quantity aged >12 months.
VALUE_7_12M_SUMNUMBERValue aged 7–12 months.
VALUE_GT_12M_SUMNUMBERValue aged >12 months.
SLOW_MO_QTY_SUMNUMBERTotal quantity classified slow-moving.
SLOW_MO_VALUE_SUMNUMBERTotal value classified slow-moving.
SLOW_MO_VALUE_RATIONUMBERSlow-moving value ÷ total on-hand value. NULL when on-hand value is 0.
CHRONIC_SLOW_MOVER_COUNTNUMBERCount of material/plant rows flagged chronically slow-moving.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_DELIVERY_PERFORMANCE_PLANT_MONTHLY — 14 columns, 190 rows

Grain: One row per plant × fiscal month, bucketed by the month of the customer's requested delivery date. Includes a synthetic anchor-month row for plants with currently-open overdue lines but zero requests this month.
Row count (live): 190
Built from (CURATED): FACT_DELIVERY, DIM_FISCAL_PERIOD, FACT_DEMAND_FORECAST (anchor-month reference only)

Plant-level delivery reliability (DRM) and OTIF scorecard.

ColumnTypeBusiness Meaning / Formula
PLANT_CODETEXTPlant code (grain key).
FISCAL_PERIOD_CODETEXTFiscal period, keyed to requested-date month (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
TOTAL_ELIGIBLE_LINESNUMBERDelivery lines with a valid on-time (DRM) flag.
ON_TIME_LINESNUMBERLines delivered on time per the DRM flag.
DRM_PCTNUMBER100 × on-time lines ÷ total eligible lines.
OTIF_ELIGIBLE_LINESNUMBERLines eligible for OTIF scoring (requires a goods-issue date, agreed qty>0, non-null actual qty).
OTIF_LINESNUMBERLines both on time and in full.
OTIF_PCTNUMBER100 × OTIF lines ÷ OTIF-eligible lines.
MISSED_NO_STOCK_COUNTNUMBERMissed deliveries attributed to no-stock-available.
MISSED_CREDIT_BLOCK_COUNTNUMBERMissed deliveries attributed to a credit block.
OPEN_OVERDUE_COUNTNUMBERCurrently-open lines whose requested date is already past, attached only to the anchor-month row (NULL elsewhere by design — a 'right now' snapshot, not a monthly time series).
AVG_DAYS_OVERDUENUMBERAverage days late for lines that shipped after the requested date, for that plant/month.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_DELIVERY_PERFORMANCE_CUSTOMER_MONTHLY — 7 columns, 12,011 rows

Grain: One row per customer (ship-to) × fiscal month. Powers top-N-customers-by-misses / Pareto analysis.
Row count (live): 12,011
Built from (CURATED): FACT_DELIVERY, DIM_FISCAL_PERIOD

Customer-level delivery-miss rate.

ColumnTypeBusiness Meaning / Formula
CUSTOMER_IDTEXTCustomer (ship-to) identifier (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
TOTAL_ELIGIBLE_LINESNUMBERLines with a valid DRM flag for this customer/month.
MISSED_LINESNUMBERLines that missed the on-time commitment.
MISS_RATE_PCTNUMBER100 × missed lines ÷ total eligible lines.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_DELIVERY_PERFORMANCE_PRODUCT_FAMILY_MONTHLY — 8 columns, 62 rows

Grain: One row per product family × fiscal month.
Row count (live): 62
Built from (CURATED): FACT_DELIVERY, DIM_MATERIAL, DIM_FISCAL_PERIOD

Product-family-level delivery reliability with the dominant miss reason.

ColumnTypeBusiness Meaning / Formula
PRODUCT_FAMILYTEXTProduct family; unmatched materials roll up to 'Unknown'.
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
TOTAL_ELIGIBLE_LINESNUMBERLines with a valid DRM flag for the family/month.
ON_TIME_LINESNUMBEROn-time lines.
DRM_PCTNUMBER100 × on-time lines ÷ total eligible lines.
DOMINANT_MISS_REASONTEXTThe single delay-reason category with the most missed lines for that family/month (ties broken deterministically).
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_VENDOR_PO_PERFORMANCE_MONTHLY — 14 columns, 111 rows

Grain: One row per supplier × fiscal month, bucketed by actual goods-receipt month (falls back to planned delivery date for not-yet-received lines).
Row count (live): 111
Built from (CURATED): FACT_PURCHASE_ORDER_LINE, DIM_FISCAL_PERIOD

Vendor purchase-order performance scorecard.

ColumnTypeBusiness Meaning / Formula
DC_SUPPLIER_IDTEXTSupplier identifier (grain key).
DC_SUPPLIER_NAMETEXTSupplier name.
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
PO_LINE_COUNTNUMBERTotal PO lines for the supplier/month (received or still open).
RECEIVED_LINE_COUNTNUMBERLines actually received — the denominator basis below, so not-yet-received lines never silently count as on-time.
ON_TIME_LINE_COUNTNUMBERReceived lines not flagged delayed.
PO_ON_TIME_PCTNUMBER100 × on-time received lines ÷ received lines.
OTIF_LINE_COUNTNUMBERReceived lines both on time and in full.
VENDOR_OTIF_PCTNUMBER100 × OTIF lines ÷ received lines.
AVG_DAYS_LATENUMBERAverage days late, computed only over lines with a positive supply delay.
LATE_PO_COUNTNUMBERLines flagged significantly delayed.
LEAD_TIME_VARIABILITYFLOATSTDDEV of (actual − planned lead time) across the supplier's lines that month. NULL when fewer than 2 lines exist.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_MATERIAL_PLANT_PLANNING_PARAMS — 17 columns, 56,060 rows

Grain: One row per material × plant — a current snapshot, not a monthly time series. A parameter-health table reflecting the latest known state.
Row count (live): 56,060
Built from (CURATED): BRIDGE_MATERIAL_PLANT, FACT_DEMAND_FORECAST, FACT_INVENTORY, FACT_PURCHASE_ORDER_LINE

MRP-parameter calibration health, comparing configured safety stock/reorder point against a recalculated 'should-be' figure.

ColumnTypeBusiness Meaning / Formula
MATERIAL_12NCTEXTMaterial identifier (grain key).
PLANT_CODETEXTPlant code (grain key).
MRP_TYPETEXTMRP type/strategy code.
MRP_CONTROLLERTEXTResponsible planner/controller.
SAFETY_STOCKNUMBERConfigured safety-stock quantity.
REORDER_POINTNUMBERConfigured reorder-point quantity.
MAX_ORDER_QTYNUMBERConfigured maximum order/stock quantity.
TOTAL_INBOUND_LT_DAYSNUMBERTotal inbound lead time in days.
AVG_DAILY_DEMANDNUMBERSum of demand quantity over the trailing 3 known fiscal months ÷ 90 days, anchored to the latest known period.
CALCULATED_ROPNUMBER'Should-be' reorder point = avg daily demand × total inbound lead-time days.
IS_ROP_CALIBRATEDBOOLEANTRUE if reorder_point ≥ calculated_rop. NULL when avg daily demand can't be computed.
HAS_DEMAND_ACTIVITY_12MOBOOLEANAny demand-forecast activity in the trailing 12 months.
HAS_INVENTORY_ACTIVITY_12MOBOOLEANAny on-hand or GIT inventory in the trailing 12 months.
HAS_PO_ACTIVITY_12MOBOOLEANAny purchase-order activity in the trailing 12 months.
IS_ACTIVEBOOLEANTRUE if any of the three activity flags above is TRUE.
MRP_EXCEPTION_FLAGBOOLEANProxy exception flag (not a genuine SAP MRP exception code — none exists in source): TRUE if current unrestricted stock is below safety stock OR above max order quantity.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_INVENTORY_TURNOVER_MATERIAL_MONTHLY — 9 columns, 364,002 rows

Grain: One row per material × plant × fiscal month.
Row count (live): 364,002
Built from (CURATED): FACT_DEMAND_FORECAST (actual-sales rows only), FACT_INVENTORY, BRIDGE_MATERIAL_PLANT

Inventory turnover ratio, sales value against inventory value.

ColumnTypeBusiness Meaning / Formula
MATERIAL_12NCTEXTMaterial identifier (grain key).
PLANT_CODETEXTPlant code (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
ACTUAL_SALES_VALUE_EURNUMBERActual sales value in EUR (from actual-sales category rows).
ON_HAND_VALUE_EURNUMBERTotal on-hand inventory value in EUR.
TURNOVER_RATIO_MONTHLYNUMBERActual sales value ÷ on-hand value. NULL when on-hand value is below 1 EUR (avoids extreme ratios from near-zero residual stock).
MRP_TYPETEXTMRP type, joined for reference/filtering.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_SUPPLY_HEALTH_MATERIAL_PLANT_MONTHLY — 23 columns, 364,388 rows

Grain: One row per material × plant × fiscal month. The cross-domain workhorse table — a material/plant/period is included as long as it has at least one of an inventory, demand, or inbound-PO signal.
Row count (live): 364,388
Built from (CURATED): FACT_INVENTORY, FACT_DEMAND_FORECAST, FACT_INBOUND_SUPPLY_EVENT, DIM_FISCAL_PERIOD, BRIDGE_MATERIAL_PLANT

Combines inventory, demand, planning parameters, and inbound-PO signal into a single row so stockout/safety-stock/days-of-supply questions don't require multi-way joins.

ColumnTypeBusiness Meaning / Formula
MATERIAL_12NCTEXTMaterial identifier (grain key).
PLANT_CODETEXTPlant code (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
UNRESTRICTED_QTYNUMBEROn-hand quantity that is unrestricted (freely usable).
RESTRICTED_QTYNUMBEROn-hand quantity that is restricted (e.g. quality-hold).
RESTRICTED_RATIONUMBERRestricted qty ÷ (unrestricted + restricted qty).
GIT_QTYNUMBERGoods-in-transit quantity.
TOTAL_VALUE_EURNUMBERTotal inventory value across all stock statuses.
DEMAND_QTY_MONTHLYNUMBERTotal forecast demand quantity for the material/plant/month.
DOS_DAYSNUMBERDays of Supply = unrestricted qty ÷ (monthly demand ÷ 30). NULL when there's no demand that month.
SAFETY_STOCKNUMBERConfigured safety-stock quantity.
REORDER_POINTNUMBERConfigured reorder-point quantity.
MAX_ORDER_QTYNUMBERConfigured maximum order/stock quantity.
IS_BELOW_SAFETY_STOCKBOOLEANTRUE if unrestricted qty is below safety stock. NULL when safety stock isn't configured.
IS_ABOVE_MAX_STOCKBOOLEANTRUE if unrestricted qty exceeds the maximum order quantity. NULL when max order qty isn't configured.
EXCESS_QTY_OVER_MAXNUMBERStock held above the configured maximum, floored at 0.
IS_STOCKOUT_RISKBOOLEANTRUE when unrestricted qty is 0 AND there is positive demand that month.
OPEN_PO_QTY_IN_MONTHNUMBERTotal quantity expected from open inbound POs due that month.
HAS_COVERING_POBOOLEANTRUE if any open inbound PO quantity is due that month.
MRP_TYPETEXTMRP type, joined for reference.
MRP_CONTROLLERTEXTResponsible planner/controller.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_FORECAST_TO_DELIVERY_MATERIAL_MONTHLY — 10 columns, 13,390 rows

Grain: One row per material × fiscal month (no plant split — delivery lines are summed across plants to match the material-level grain of the forecast-performance table).
Row count (live): 13,390
Built from (CURATED): FACT_DELIVERY, DIM_FISCAL_PERIOD, plus AGG_FORECAST_PERFORMANCE_MATERIAL_MONTHLY for the bias figure

Links forecast bias to downstream delivery/stockout impact.

ColumnTypeBusiness Meaning / Formula
MATERIAL_12NCTEXTMaterial identifier (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
BIAS_RATIO_N3NUMBERForecast bias at the N-3 horizon, carried from the material forecast-performance table.
IS_HIGH_BIASBOOLEANTRUE when the absolute N-3 bias ratio exceeds 25% — the business-agreed threshold.
TOTAL_DELIVERY_LINESNUMBERTotal delivery lines for the material/month, summed across plants.
NO_STOCK_MISS_LINESNUMBERDelivery lines missed specifically due to no stock available.
NO_STOCK_MISS_RATENUMBERNo-stock miss lines ÷ total delivery lines.
HAS_NO_STOCK_MISSBOOLEANTRUE if the material/month had at least one no-stock-caused miss.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_CROSS_DOMAIN_RISK_MATERIAL_PLANT_MONTHLY — 12 columns, 364,388 rows

Grain: One row per material × plant × fiscal month. Combines risk flags from other AGGREGATE tables to identify materials/plants at risk across multiple domains simultaneously.
Row count (live): 364,388
Built from (CURATED): FACT_DELIVERY, FACT_PURCHASE_ORDER_LINE, DIM_FISCAL_PERIOD, plus AGG_SUPPLY_HEALTH_MATERIAL_PLANT_MONTHLY and AGG_FORECAST_TO_DELIVERY_MATERIAL_MONTHLY

Composite cross-domain risk score. Equal-weight (25 points/domain) scoring is a starting-point convention, not a validated business weighting. This table's row scope follows the supply-health table's coverage, so a material/plant/period with only a late-PO or delivery-miss signal and no inventory/demand/inbound-PO row will not appear here — a known, small, documented coverage limitation.

ColumnTypeBusiness Meaning / Formula
MATERIAL_12NCTEXTMaterial identifier (grain key).
PLANT_CODETEXTPlant code (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
IS_STOCKOUT_RISKBOOLEANCarried from the supply-health table (zero stock with positive demand).
HAS_NO_STOCK_MISSBOOLEANTRUE if the material/plant/month had at least one no-stock-caused delivery miss.
HAS_LATE_POBOOLEANTRUE if the material/plant/month had at least one significantly delayed purchase order.
IS_HIGH_BIASBOOLEANHigh-bias flag (>25% at N-3), broadcast from the material-level forecast-to-delivery table (material+period grain, no plant split there).
RISK_DOMAIN_COUNTNUMBERCount of risk domains triggered (0–4): stockout risk, no-stock miss, late PO, high bias.
SUPPLY_CHAIN_RISK_SCORENUMBERrisk_domain_count × 25 (equal-weighted, 0–100 scale).
IS_MULTI_DOMAIN_RISKBOOLEANTRUE when 2 or more risk domains trigger simultaneously.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.
AGG_PLANT_SCORECARD_MONTHLY — 9 columns, 497 rows

Grain: One row per plant × fiscal month. An executive rollup for plant ranking and trending.
Row count (live): 497
Built from (CURATED): FACT_PURCHASE_ORDER_LINE, DIM_FISCAL_PERIOD, plus AGG_CROSS_DOMAIN_RISK_MATERIAL_PLANT_MONTHLY and AGG_DELIVERY_PERFORMANCE_PLANT_MONTHLY

Executive plant scorecard combining risk, delivery, and purchasing performance.

ColumnTypeBusiness Meaning / Formula
PLANT_CODETEXTPlant code (grain key).
FISCAL_PERIOD_CODETEXTFiscal period (grain key).
CALENDAR_MONTH_KEYTEXTCalendar month.
MATERIAL_PLANT_COUNTNUMBERMaterial/plant combinations scored for the plant/month.
AVG_RISK_SCORENUMBERAverage composite supply-chain risk score across all materials at the plant.
MULTI_DOMAIN_RISK_COUNTNUMBERMaterial/plant combinations flagged multi-domain risk.
DRM_PCTNUMBERDelivery reliability % for the plant/month, carried from the delivery-performance table.
PLANT_PO_ON_TIME_PCTNUMBER100 × on-time received PO lines ÷ received PO lines.
_LOAD_TSTIMESTAMP_LTZRow build timestamp.

SEMANTICCortex Analyst Semantic Views (v2)

The four semantic views wired into SCM_AGENT_WITH_RECS, the live SCM Assistant Agent. Each view exposes logical tables, facts, dimensions, metrics, and a set of business-verified natural-language queries.

SV_GOLDEN_PURCHASING_V2 — 29 exposed fields, 9 verified queries

Purchase-order lines with actual-vs-planned lead time and vendor performance, EKET schedule lines, EKES vendor confirmations, EKBE goods movements, plus planning-parameter completeness and material-master hygiene. Overdue logic is anchored to a fixed snapshot date, not the current date, so results don't silently drift day to day.

Wrapped in the live SCM_AGENT_WITH_RECS Cortex Agent — the SCM Assistant Agent this pipeline actually serves. A separate, earlier generation of these views (without the _V2 suffix) also exists live, wired to different agents (CURATED_SCM_AGENT / CURATED_SCM_AGENT_WITH_SKILLS) — out of scope for this document by design.

Base CURATED tables: FACT_PURCHASE_ORDER_LINE, FACT_PO_SCHEDULE, FACT_PO_CONFIRMATION, FACT_GOODS_MOVEMENT, DIM_MATERIAL, DIM_PLANT, DIM_SUPPLIER_SOURCE, BRIDGE_MATERIAL_PLANT

Facts (measures) (10)

NameMeaning
open_qty, po_value_eur, ordered_qty, received_qtyCore PO-line quantities/value.
supply_delay_daysRequested-vs-actual delay. Positive = late.
actual_total_lt_days, marc_planned_lt_daysActual vs. MARC-master planned lead time.
lt_variance_daysPlanned-vs-actual gap = actual − MARC planned. Use for 'lead time gap vs plan' questions, not supply_delay_days.
late_flag, on_time_flag, severe_lt_breach_flag, lt_reliable_flagDelivery-timing flags. Severe breach = actual > 2× planned lead time.
open_overdue_flag1 when open and confirmed date is before the snapshot anchor.
scheduled_qty, open_schedule_qty, sched_overdue_flag, sched_partial_gr_flagSchedule-line (EKET) quantities and status.
confirmed_qty, reduced_qty, open_confirmed_qtyVendor confirmation (EKES) quantities.
gr_qty_net, gr_value_lc, gr_flagSigned goods-receipt quantity/value.
safety_stock, reorder_point, planned_delivery_days, total_inbound_lt_daysMaterial-plant planning parameters.

Dimensions (8)

NameMeaning
po_number, po_item, material_12nc, po_typePO line identifiers and type.
dc_supplier_id/name/country, ep_supplier_id/name/countryTwo vendor identities — DC (direct counterparty) and EP (upstream manufacturer).
vendor_category, bg_code, bu_codeVendor category and business hierarchy.
po_release_date, planned_delivery_date, confirmed_delivery_date, actual_gr_datePO date milestones.
plant_code/name, country_iso, region, plant_type, is_us_plantPlant attributes.
brand, product_family, product_class, material_group, material_type, lifecycle_phaseMaterial attributes.
is_active, sales_off_flag, innovation_flag, commercial_release_date, deletion_date, successor_12ncMaterial hygiene attributes.
mrp_controller, mrp_type, procurement_type, purchasing_group, abc_classificationPlanning parameters.

Metrics (aggregated) (11)

NameMeaning
avg_lt_variance_daysAVG(supply_delay_days) — requested-vs-actual, NOT actual-minus-planned.
avg_planned_vs_actual_lt_daysAVG(actual − MARC planned). Use this for 'gap between actual and planned lead time'.
avg_actual_lt_days, avg_planned_lt_daysSimple averages of actual/planned lead time.
vendor_on_time_pct% of PO lines delivered on time or early.
severe_lt_breach_count, lt_reliability_pctCount exceeding 2× planned LT; % within ±20% of planned LT.
vendor_fill_rate_pctReceived qty as % of ordered qty, at PO-line grain.
sched_fill_rate_pctSame fill-rate concept at schedule-line (EKET) grain — different denominator.
confirmed_received_rateVendor confirmation reliability: received vs. confirmed quantity.
open_overdue_po_lines, total_po_value_eur, distinct_vendors, distinct_po_materialsVolume/coverage metrics.
total_safety_stock, material_plants_with_safety_stock, mrp_param_missing_countPlanning-parameter completeness.
distinct_material_count, inactive_material_count, sales_off_material_countMaterial-master hygiene metrics.

Business-verified natural-language queries (9)

Which 5 vendors have the largest gap between actual and planned lead time?
Rank vendors by on-time delivery percentage.
Which materials have an actual lead time more than double their planned lead time?
Which purchase orders are open and overdue as of the snapshot?
What is the inbound fill rate at schedule-line grain?
What is vendor confirmation reliability — received versus confirmed quantity per vendor?
What percentage of PO lines have no vendor acknowledgement (unconfirmed PO rate)?
How complete are planning parameters (safety stock / reorder point) by MRP controller?
What is the material master hygiene — active, inactive and new-product counts?
SV_GOLDEN_DELIVERY_FULFILMENT_V2 — 34 exposed fields, 8 verified queries

Delivery-grain DRM reliability with the 17 MISSED_* reason buckets, sales-order-line open-order/OTIF/fill-rate/cycle-time measures, and an order-at-risk supply overlay (from SUPPLY_ORDER_IMPACT). Conformed to material, plant, customer (ship-to and sold-to, tracked separately), business unit, and delay-reason dimensions. Overdue logic anchored to the same fixed snapshot date as the purchasing view.

Wrapped in the live SCM_AGENT_WITH_RECS Cortex Agent — the SCM Assistant Agent this pipeline actually serves. A separate, earlier generation of these views (without the _V2 suffix) also exists live, wired to different agents (CURATED_SCM_AGENT / CURATED_SCM_AGENT_WITH_SKILLS) — out of scope for this document by design.

Base CURATED tables: FACT_DELIVERY, FACT_SALES_ORDER_LINE, SUPPLY_ORDER_IMPACT, DIM_MATERIAL, DIM_PLANT, DIM_CUSTOMER, DIM_BUSINESS_UNIT_BYCODE, DIM_DELAY_REASON

Facts (measures) (10)

NameMeaning
delivery_agreed_qty, delivery_actual_qtyDelivery-line quantities.
drm_pct_line, drm_reliable_flag, drm_miss_flagPer-line DRM score and outcome flags.
delay_days_adp, is_adp_unmeasurableDelay in days on a miss — the correct measure for 'how late once missed'. NOT the same as sales-order-line delivery_delay_days.
on_time_gi_flag, scored_line_flagGoods-issue timing and scoring-eligibility flags.
17 missed_* flagsOne flag per coded miss-reason bucket (no stock, credit block, transport, warehouse, wrong day, etc.), plus missed_unattributed for uncoded misses.
so_ordered_qty, so_delivered_qty, so_open_qtySales-order-line quantity position.
delivery_delay_daysSO-line lateness (requested vs. actual). Different from delay_days_adp.
order_cycle_time_daysActual delivery date minus SO creation date.
so_on_time_flag, so_in_full_flag, so_otif_flag, so_open_flag, so_open_overdue_flag, so_drm_miss_flagSO-line status flags.
soi_open_qty, soi_order_qty_at_risk, soi_cumulative_shortage_qty, soi_available_inventory_qty, soi_open_po_countOrder-at-risk supply overlay from SUPPLY_ORDER_IMPACT.

Dimensions (13)

NameMeaning
sales_order_number/item, delivery_number, material_12nc, plant_keyDelivery-line identifiers.
customer_key (ship-to), sold_to_idTwo distinct customer roles, resolved via separate CUSTOMER / SOLD_TO_CUSTOMER logical tables.
bu_code, bannerBusiness unit and key-account attribution.
primary_delay_reason, delay_reason_group, miss_reasonmiss_reason is the turn-key label: unattributed misses resolve to 'Uncategorized', sorted last in any breakdown.
rejection_reason_code/label/desclabel is display-ready — 'Unclassified' when rejected with no code, NULL when not rejected.
drm_segment_noteAnnotates ADP-unmeasurable/rejected lines now scored rather than excluded (2026-08-17 pipeline change).
delivery_block_code/desc, overall_delivery_statusBlock and status fields.
customer_requested_date, actual_delivery_date, actual_goods_issue_date, carrier, ag_nameDates and shipment attributes.
order_status, so_delivery_block_code/desc, so_rejection_reason_desc, so_creation_date, so_requested_dateSO-line status and date fields.
soi_anchor_month, soi_order_at_risk_flag, soi_inventory_shortage_flag, soi_supply_delay_flagSupply-risk dimensions, already snapshot-anchored (no current-date drift).
material/plant/customer attributesbrand, product_family, product_class, lifecycle_phase, plant geography, customer name/country.
bu_name, bg_nameResolved business-unit names (e.g. Hue Connected) — use these, not raw codes, for outbound BU breakdowns.
reason_code/description/group/sourceDelay-reason dimension lookup.

Metrics (aggregated) (11)

NameMeaning
drm_reliability_pctSUM(scored)/SUM(total) × 100 — additive at any grain. The delivery-grain (on-time) reliability / OTIF figure.
delivery_grain_otif_pctOn-time AND in-full at delivery grain — different denominator from the SO-line OTIF below.
missed_lines, missed_unitsCount of misses and the commercially-weighted agreed quantity on missed lines.
avg_delay_days_adp, median_delay_days_adpAverage/median lateness on a miss — pair both, the distribution is right-skewed.
18 *_miss_rate / *_loss_rate metricsShare-of-misses vs. per-scored-opportunity versions for each of the 17 miss-reason buckets.
distinct_customers, distinct_materials, distinct_ordersCoverage metrics.
so_line_count, open_order_lines, open_overdue_order_lines, total_open_qtySO-line volume metrics.
otif_pct, on_time_pct, in_full_pct, fill_rate_pctSO-line-grain fulfilment KPIs — different denominators from the delivery-grain versions above.
avg_days_overdue, median_days_overdueSO-line lateness over late lines only.
avg_order_cycle_time_days, median_order_cycle_time_daysOrder-to-delivery cycle time.
order_lines_at_risk, total_order_qty_at_risk, total_cumulative_shortage_qtySupply-risk rollups.

Business-verified natural-language queries (8)

How has DRM percentage trended over the last 6 months?
Which plants or DCs are dragging down network DRM the most?
What are the top reasons for delivery shortfalls?
Which customers have the most units on missed lines?
How many open overdue orders do I have and for how much quantity?
What is the average order cycle time by plant?
Which materials have the most open order quantity at risk from supply?
Which business units have the worst OTIF percentage?
SV_SCM_DEMAND_PLANNING_V2 — 40 exposed fields, 8 verified queries

APO demand forecast and sales actuals, forecast accuracy/bias (WMAPE at lags N0–N3, volume-weighted bias, demand coefficient of variation), slow-moving/dead-stock, on-hand/GIT inventory for days-of-supply, and the projected supply position. FACT_FORECAST_PERFORMANCE is already 100% US — no US filter is needed or possible on that table.

Wrapped in the live SCM_AGENT_WITH_RECS Cortex Agent — the SCM Assistant Agent this pipeline actually serves. A separate, earlier generation of these views (without the _V2 suffix) also exists live, wired to different agents (CURATED_SCM_AGENT / CURATED_SCM_AGENT_WITH_SKILLS) — out of scope for this document by design.

Base CURATED tables: FACT_DEMAND_FORECAST, FACT_FORECAST_PERFORMANCE, FACT_SLOW_MOVING_INVENTORY, FACT_INVENTORY, SUPPLY_POSITION_BY_DATE, DIM_MATERIAL, DIM_PLANT, DIM_FISCAL_PERIOD, DIM_BUSINESS_UNIT_BYCODE

Facts (measures) (11)

NameMeaning
forecast_qty, forecast_value_eurPlanned/actual quantity and value — NULL for the non-matching measure type on each row.
planned_qty_n/n1/n2/n3Consensus forecast at each snapshot lag.
actual_delivered_qtyActual delivered quantity — the denominator for accuracy/bias metrics below.
abs_dev_n0/n1/n2/n3Absolute forecast deviation at each lag.
forecast_accuracy_nPer-row accuracy. Unbounded below — prefer the WMAPE-based overall metric for reporting.
forecast_bias_pctPer-row signed bias ratio. Extreme where actual is tiny — use the volume-weighted metric, not a simple average of this column.
planned_qxp_n/n1/n2/n3Monetary consensus forecast at each lag.
slow_mo_qty/value, qty_gt_12m, value_gt_12m, qty_7_12m, value_7_12m, qty_0_6mSlow-moving aging-bucket quantities/values.
smi_on_hand_qty/value, smi_git_qty, slow_mo_value_pct, smos_month_countSlow-moving on-hand context and duration counter.
inv_on_hand_qty/git_qty/total_qty, inv_on_hand_value/git_value/total_value, inv_on_hand_pctInventory position facts, at storage-location+stock-type grain.
projected_balance_qty, open_demand_qty, eligible_inbound_qty, cumulative_supply_available, cumulative_demand_qtySupply-position projection facts.

Dimensions (14)

NameMeaning
key_figure, measure_typeAPO key figure code and QUANTITY/VALUE_EUR classifier.
channel_group, demand_planning_account, segmentSales channel, planning account, market segment.
source_fileDEMAND_QXP (forecast) vs. SALES_VIPP (actuals) — always filter, key_figure alone doesn't distinguish.
demand_bg_code, oru_key, mru_key, currencyBusiness group and planning hierarchy keys.
fc_planning_account, scm_area_code, fc_bg/bu/magForecast-performance-side hierarchy and area code (SCM area is country-level, not plant-level).
is_high_biasTRUE when |bias ratio| > 0.20.
fp_material_12nc, fp_monthFact-local material/month keys for the forecast-performance table.
demand_flag, demand_category, is_chronic_slow_mover, has_slow_stock_gt_12mSlow-moving classification dimensions.
smi_bg_code, smi_mag_code, sm_material_12nc, sm_plant_codeFact-local slow-moving keys.
storage_location, stock_type, is_unrestricted, inv_monthInventory-snapshot dimensions. is_unrestricted is the correct availability filter.
sp_material_12nc, sp_plant_code, position_dateFact-local supply-position keys.
material/plant attributesbrand, product_family (NOT the same as BU — Hue/WiZ are business units), lifecycle_phase, supply_class, is_active, successor_12nc, plant geography.
calendar_month_key, fiscal_year/quarter/half, month_nameTime dimension, from the fiscal-period lookup.
bu_code/name, bg_key/nameBusiness hierarchy — MAG is a sub-level below BU, only available on forecast_performance.mag / slow_moving.mag_code, not on the demand-forecast fact itself.

Metrics (aggregated) (15)

NameMeaning
total_forecast_qtySums BOTH forecast and actuals — do not use without filtering source_file.
forecast_plan_qty, actual_sales_qtyForecast-only and actuals-only quantity, correctly separated by source_file.
demand_plan_vs_actual_bias_pctPlan-vs-actual bias rebuilt from source, aligned to the same period window.
total_forecast_value_eur, distinct_forecast_materialsValue total and material coverage.
total_consensus_n/n1/n2/n3, total_actual_deliveredTotal consensus forecast at each lag vs. actual.
total_deviation_n, plan_vs_actual_gap_n3, signed_plan_vs_actual_gap_n3Absolute and signed deviation totals.
overall_forecast_accuracy1 − WMAPE, computed at the overall (SUM/SUM) level — not an average of per-row accuracy.
weighted_forecast_bias_pctThe one canonical bias metric — volume-weighted, not a row-average.
wmape, wmape_n1/n2/n3The canonical forecast-error metric at each lag, SUM/SUM over the full population (zero-actual rows are legitimate errors, not excluded).
demand_cvCoefficient of variation — STDDEV/AVG of actuals, the basis for XYZ segmentation.
high_bias_material_count, total_qxp_nHigh-bias material count and total monetary forecast.
total_slow_mover_qty/value, total_dead_stock_qty/value, total_aged_qty/value_7_12m, total_fresh_stock_qtySlow-moving rollups — all repeating snapshots, filter the latest period.
dead_stock_pct, distinct_slow_moving_materialsDead-stock share of on-hand and material coverage.
total_on_hand_qty, unrestricted_on_hand_qty, total_git_qty, total_effective_stock, total_on_hand/git/inventory_valueInventory rollups.
total_projected_balance, projected_shortage_qty, material_plants_in_shortageSupply-position rollups.

Business-verified natural-language queries (8)

What is the weighted MAPE across all materials?
What is the volume-weighted forecast bias by business unit?
How does weighted forecast error change from the 3-month to the current horizon?
Which materials have the most variable demand (highest coefficient of variation)?
Which materials have the highest dead stock (no movement over 12 months) in the latest period?
What is the days of supply (stock cover) by material and plant?
Where is projected supply short of demand (plan versus available supply gap)?
Which materials are over- or under-forecast by more than 20 percent?
SV_SCM_INVENTORY_V2 — 30 exposed fields, 7 verified queries

On-hand/GIT stock, aging/dead-stock buckets, replenishment parameters, available-stock share, and below-safety-stock exposure. Slow-moving and inventory are both repeating monthly snapshots — filter to the latest period. Both EUR figures are already actual EUR (no ×1,000 scaling needed).

Wrapped in the live SCM_AGENT_WITH_RECS Cortex Agent — the SCM Assistant Agent this pipeline actually serves. A separate, earlier generation of these views (without the _V2 suffix) also exists live, wired to different agents (CURATED_SCM_AGENT / CURATED_SCM_AGENT_WITH_SKILLS) — out of scope for this document by design.

Base CURATED tables: FACT_INVENTORY, FACT_SLOW_MOVING_INVENTORY, BRIDGE_MATERIAL_PLANT, DIM_MATERIAL, DIM_PLANT, DIM_FISCAL_PERIOD, DIM_BUSINESS_UNIT_BYCODE

Facts (measures) (8)

NameMeaning
on_hand_qty, git_qty, total_qty_incl_gitInventory position quantities, at storage-location+stock-type grain.
on_hand_value_eur, git_value_eur, total_value_eurInventory position values.
on_hand_pct_of_totalOn-hand as % of total including GIT.
slow_mo_qty/value, qty_gt_12m, value_gt_12m, qty_7_12m, value_7_12m, qty_0_6mSlow-moving aging-bucket facts.
smi_on_hand_qty/value, smi_git_qty, slow_mo_value_pct, smos_month_countSlow-moving on-hand context and duration counter.
safety_stock, reorder_pointReplenishment parameters. Both sparse — ~1.1% coverage.
planned_delivery_days, gr_processing_days, total_inbound_lt_days, total_replenishment_lt_daysLead-time parameters.
moq, min_order_qty, max_order_qtyOrder-quantity constraints.

Dimensions (9)

NameMeaning
storage_location, stock_type, stock_type_desc, is_unrestrictedInventory-snapshot dimensions. is_unrestricted is the correct availability filter — there's no literal 'unrestricted' value on stock_type itself.
inv_plant_code, inv_monthFact-local inventory keys.
demand_flag, demand_category, is_chronic_slow_mover, has_slow_stock_gt_12mSlow-moving classification.
smi_bg_code, smi_mag_code, sm_material_12nc, sm_plant_code, sm_monthFact-local slow-moving keys.
mp_material_12nc, mp_plant_code, abc_classificationFact-local replenishment-parameter keys and ABC class.
material attributesbrand, product_family, product_class (removed — 100% NULL, see finding below), product_segment/type, lifecycle_phase, supply_class, is_active.
plant attributesplant_code/name, country, country_iso, region, plant_type (removed — 100% NULL), is_us_plant.
calendar_month_key, fiscal_year/quarter/half, month_nameTime dimension.
bu_code/name, bg_key/nameBusiness hierarchy.

Metrics (aggregated) (13)

NameMeaning
total_on_hand_qtyTotal on-hand across ALL stock types — for available-only, use the metric below.
unrestricted_on_hand_qty, unrestricted_on_hand_value_eurAvailable-stock-only quantity and value — the correct basis for DOS and stockout-risk questions.
available_stock_share_pctUnrestricted on-hand as % of total on-hand — ~96% network-wide in the latest period.
total_git_qty, total_effective_stockGoods-in-transit and effective (on-hand + GIT) stock.
total_on_hand_value_eur, total_git_value_eur, total_inventory_value_eurValue rollups, all actual EUR.
distinct_materialsMaterial coverage carrying stock.
total_safety_stock, material_plants_with_safety_stockSafety-stock totals and coverage count — surface the ~1.1% coverage whenever this is used.
avg_planned_lead_time, avg_replenishment_ltAverage lead-time metrics.
total_slow_mover_qty/value_eur, total_dead_stock_qty/value, total_aged_qty/value_7_12m, total_fresh_stock_qtySlow-moving rollups — repeating snapshots, filter the latest period; mixed base UOM, include base_uom as a dimension.
total_smi_on_hand_qty/valueSlow-moving on-hand denominators.
dead_stock_pct, slow_mover_pct, aging_coverage_ratioDead-stock and slow-moving share metrics — network SLOB ≈28%.
healthy_stock_qty, slow_moving_stock_qty, slow_moving_qty_pctClient-definition healthy (0-6mo) vs. slow-moving (6+ mo) rollups.
distinct_slow_moving_materialsMaterial coverage of the slow-moving population.

Business-verified natural-language queries (7)

Which plant has the highest on-hand inventory in the latest period?
What share of on-hand stock is available (unrestricted) by plant?
Which plant has the highest dead stock value in the latest period?
Which US plants have the most materials currently below their safety stock?
How much slow-moving stock is there right now by plant?
Which materials have the longest planned lead time?
Which storage locations hold the most blocked or QI stock?