Inventory Analytics with Power BI: Stock, Turnover, and Demand

Build Power BI inventory analytics dashboards covering stock levels, inventory turnover, ABC analysis, demand forecasting, and reorder point calculations with DAX formulas.

E
ECOSIRE Research and Development Team
|19. März 20269 Min. Lesezeit2.0k Wörter|

Teil unserer Supply Chain & Procurement-Serie

Den vollständigen Leitfaden lesen

Bestandsanalyse mit Power BI: Bestand, Umsatz und Nachfrage

Überschüssiger Lagerbestand kostet jährlich 25–30 % seines Wertes an Lagerkosten. Fehlbestände kosten Einzelhändlern jedes Jahr schätzungsweise 1 Billion US-Dollar an Umsatzeinbußen. Zwischen diesen beiden Extremen liegt die schmale Bandbreite des optimalen Inventars – und Power BI ist das Tool, das Betriebsteams genau auf dieser Linie hält.

Die Herausforderung bei der Bestandsanalyse in Power BI besteht darin, dass der Bestand ein Momentaufnahmemaß ist (wie viel haben wir gerade?) und nicht ein Flussmaß (wie viel wurde diesen Monat verkauft?). Diese Unterscheidung bestimmt jede Entwurfsentscheidung im Datenmodell und jedes DAX-Berechnungsmuster. Dieser Leitfaden deckt die gesamte Bestandsanalyseplattform ab: Datenmodell, ABC-Klassifizierung, Umsatzanalyse, Nachbestellpunktberechnungen und Visualisierungen der Bedarfsprognose.

Wichtige Erkenntnisse

  • Der Lagerbestand ist eine Point-in-Time-Messung (Momentaufnahme), die andere DAX-Muster erfordert als Verkaufskennzahlen – Die ABC-Analyse klassifiziert Artikel nach Umsatzbeitrag: A (oberste 80 %), B (nächste 15 %), C (untere 5 %).
  • Lagerumschlag = Selbstkosten / durchschnittlicher Lagerbestand – variiert stark je nach Branche
  • Nachbestellpunkt = (Durchschnittlicher täglicher Verbrauch × Vorlaufzeit) + Sicherheitsbestand
  • Die DAX RANKX-Funktion unterstützt die ABC-Klassifizierung automatisch, wenn sich Daten ändern – Die Bedarfsprognose in Power BI nutzt lineare Regression über DAX- oder Azure ML-Integration
  • Die Identifizierung langsamer und veralteter Bestände (SLOB) spart erhebliche Lagerkosten
  • Power BI stellt ohne Datenverschiebung eine Verbindung zu ERP-Bestandstabellen (Odoo, SAP, NetSuite) her

Datenmodell für Bestandsanalysen

Kerninventartabellen

Inventory_Snapshot (eine Zeile pro Artikel pro Tag/Woche – Zeitpunkt der Lagerbestände):

SpalteBeschreibung
SnapshotDateDatum der Bestandszählung
ItemIDFK zu Artikel-/Produktdimension
LocationIDFK zum Lager/Standort
QuantityOnHandPhysische Lagermenge
QuantityOnOrderMenge an offenen Bestellungen
QuantityReservedFür offene Bestellungen zugesagte Menge
QuantityAvailableQoH – Reserviert
UnitCostDurchschnitts- oder Standardkosten
StockValueQuantityOnHand × UnitCost

Bestandsbewegungen (eine Zeile pro Lagertransaktion):

SpalteBeschreibung
MovementIDTransaktions-ID
ItemIDFK zu Artikel
LocationIDFK zum Standort
MovementDateDatum der Bewegung
MovementTypeEmpfang, Verkauf, Übertragung, Anpassung, Rückgabe
QuantityBewegte Menge (positiv = rein, negativ = raus)
UnitCostKosten pro Einheit zum Zeitpunkt der Bewegung

Sales_Lines (eine Zeile pro Kundenauftragszeile für die Bedarfsanalyse):

  • OrderID, ItemID, OrderDate, ShipDate, Quantity, UnitPrice, Revenue, CustomerID

Purchase_Orders (zur Durchlaufzeit- und Beschaffungsanalyse):

  • POID, ItemID, OrderDate, ExpectedDate, ReceiptDate, Quantity, UnitCost

Dim_Item (Produktdimension):

  • ItemID, SKU, Name, Category, SubCategory, Supplier, LeadTimeDays, ReorderPoint, SafetyStock, UnitCost, ListPrice, IsActive

Kernbestands-KPIs mit DAX

Lagerbestandsmessungen

// Current Stock on Hand (point-in-time)
Stock on Hand =
CALCULATE(
    SUM(Inventory_Snapshot[QuantityOnHand]),
    Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)

// Stock Value (current)
Stock Value =
CALCULATE(
    SUM(Inventory_Snapshot[StockValue]),
    Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)

// Available to Promise (ATP)
Available to Promise =
CALCULATE(
    SUM(Inventory_Snapshot[QuantityAvailable]),
    Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)

// Stock on Order (incoming POs)
Stock on Order =
CALCULATE(
    SUM(Inventory_Snapshot[QuantityOnOrder]),
    Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)

// Projected Stock (current + on order - reserved)
Projected Stock = [Stock on Hand] + [Stock on Order] - [Stock Reserved]

Lagerumschlag

// COGS in Period (for turnover denominator)
Total COGS =
SUMX(
    FILTER(Inventory_Movements, Inventory_Movements[MovementType] = "Sale"),
    Inventory_Movements[Quantity] * Inventory_Movements[UnitCost]
)

// Average Inventory Value (beginning + ending / 2)
Avg Inventory Value =
AVERAGEX(
    VALUES(Date[Month]),
    CALCULATE(
        SUM(Inventory_Snapshot[StockValue]),
        Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
    )
)

// Inventory Turnover Ratio
Inventory Turnover =
DIVIDE([Total COGS], [Avg Inventory Value], 0)

// Days Inventory Outstanding (DIO)
Days Inventory Outstanding =
DIVIDE(365, [Inventory Turnover], 0)

// Benchmark comparison (industry varies widely)
// Manufacturing: 6-12x | Retail: 4-6x | Electronics: 8-15x
Turnover vs Benchmark =
[Inventory Turnover] -
LOOKUPVALUE(
    Industry_Benchmark[InventoryTurnover],
    Industry_Benchmark[Category],
    SELECTEDVALUE(Dim_Item[Category])
)

ABC-Analyse

Die ABC-Analyse klassifiziert Lagerartikel nach ihrem Umsatz- oder Kostenbeitrag:

  • A-Punkte: Top 80 % des Umsatzes/COGS – hohe Priorität, strenge Kontrolle
  • B-Artikel: Die nächsten 15 % – mäßige Kontrolle
  • C-Artikel: Untere 5 % – minimale Kontrolle
// Revenue contribution per item (last 12 months)
Item Revenue 12M =
CALCULATE(
    SUM(Sales_Lines[Revenue]),
    DATESINPERIOD(Date[Date], TODAY(), -12, MONTH)
)

// Cumulative revenue % (for ABC cutoff)
Cumulative Revenue % =
DIVIDE(
    SUMX(
        FILTER(
            ALL(Dim_Item),
            RANKX(ALL(Dim_Item), [Item Revenue 12M], , DESC) <=
            RANKX(ALL(Dim_Item), [Item Revenue 12M], , DESC)
        ),
        [Item Revenue 12M]
    ),
    CALCULATE([Item Revenue 12M], ALL(Dim_Item)),
    0
)

// ABC Classification (calculated column in Dim_Item, refreshed periodically)
ABC Class =
VAR CumPct = [Cumulative Revenue %]
RETURN
SWITCH(TRUE(),
    CumPct <= 0.80, "A",
    CumPct <= 0.95, "B",
    "C"
)

// ABC Summary measure
A Items Count = CALCULATE(COUNTROWS(Dim_Item), Dim_Item[ABC Class] = "A")
A Items Revenue % = DIVIDE(
    CALCULATE([Item Revenue 12M], Dim_Item[ABC Class] = "A"),
    CALCULATE([Item Revenue 12M], ALL(Dim_Item)),
    0
)

ABC-XYZ-Matrix

Erweitern Sie ABC mit der XYZ-Klassifizierung für Nachfragevariabilität:

  • X: Geringe Nachfragevariabilität (CV < 0,5) – vorhersehbar, Effizienzplanung
  • Y: Mittlere Variabilität (CV 0,5-1,0) – gewisse Unsicherheit
  • Z: Hohe Variabilität (CV > 1,0) – unvorhersehbar, Servicelevel planen
// Coefficient of Variation for demand variability
Demand CV =
DIVIDE(
    STDEV.P(Sales_Lines[Quantity]),
    AVERAGE(Sales_Lines[Quantity]),
    0
)

// XYZ Classification
XYZ Class =
SWITCH(TRUE(),
    [Demand CV] < 0.5, "X",
    [Demand CV] < 1.0, "Y",
    "Z"
)

Das AX-Segment (hoher Umsatz, vorhersehbare Nachfrage) unterliegt dem strengsten Nachbestellungsmanagement. Das CZ-Segment (geringer Umsatz, unvorhersehbar) ist ein Kandidat für die Eliminierung oder Auftragsfertigung.


Nachbestellpunkt- und Sicherheitsbestandsberechnungen

Punktformel neu anordnen

Nachbestellpunkt = (Durchschnittlicher täglicher Verbrauch × Vorlaufzeit) + Sicherheitsbestand

// Average Daily Usage (last 90 days)
Avg Daily Usage =
DIVIDE(
    CALCULATE(
        SUM(Sales_Lines[Quantity]),
        DATESINPERIOD(Date[Date], TODAY(), -90, DAY)
    ),
    90,
    0
)

// Reorder Point calculation
Calculated Reorder Point =
ROUND(
    [Avg Daily Usage] * AVERAGE(Dim_Item[LeadTimeDays]) +
    Dim_Item[SafetyStock],
    0
)

// Below Reorder Point flag
Below Reorder Point =
IF([Stock on Hand] < [Calculated Reorder Point], "Reorder Required", "OK")

// Days of Supply remaining
Days of Supply =
DIVIDE([Stock on Hand], [Avg Daily Usage], 0)

// Stockout Risk Score (0-100)
Stockout Risk =
SWITCH(TRUE(),
    [Days of Supply] < 7, 100,     -- Critical
    [Days of Supply] < 14, 75,     -- High risk
    [Days of Supply] < 30, 50,     -- Medium risk
    [Days of Supply] < 60, 25,     -- Low risk
    0                               -- OK
)

Berechnung des Sicherheitsbestands

// Safety Stock using statistical method
// SS = Z-score × σ(demand) × √Lead Time
Safety Stock Calculated =
VAR ZScore = 1.645   -- 95% service level
VAR DemandStdDev = STDEV.P(Sales_Lines[Quantity])  -- per day
VAR LeadTime = AVERAGE(Dim_Item[LeadTimeDays])
RETURN ROUND(ZScore * DemandStdDev * SQRT(LeadTime), 0)

Slow-Moving and Obsolete (SLOB)-Bestand

Die Identifizierung des SLOB-Bestands ist für die Optimierung des Betriebskapitals von entscheidender Bedeutung:

// Days Since Last Sale
Days Since Last Sale =
DATEDIFF(
    CALCULATE(
        MAX(Sales_Lines[OrderDate]),
        ALL(Date)
    ),
    TODAY(),
    DAY
)

// SLOB Classification
SLOB Class =
SWITCH(TRUE(),
    [Days Since Last Sale] > 365, "Obsolete",
    [Days Since Last Sale] > 180, "Slow Moving",
    [Days Since Last Sale] > 90, "At Risk",
    "Active"
)

// SLOB Inventory Value
SLOB Value =
CALCULATE(
    [Stock Value],
    Dim_Item[SLOB Class] IN {"Slow Moving", "Obsolete"}
)

// SLOB as % of total inventory
SLOB % =
DIVIDE([SLOB Value], [Stock Value], 0)

Visualisierung der Nachfrageprognose

Power BI kann Bedarfsprognosen visualisieren mit:

Integrierte Prognose (Analysebereich)

Klicken Sie mit der rechten Maustaste auf ein Liniendiagramm → Analysebereich → Prognose:

  • Prognosedauer: 12 Monate
  • Konfidenzintervall: 95 %
  • Saisonalität: Automatische Erkennung

Dabei wird der Algorithmus Exponential Smoothing (ETS) verwendet – geeignet für einfache, stationäre Nachfragemuster.

Benutzerdefinierte lineare DAX-Prognose

// Simple Linear Regression Forecast
Demand Forecast =
VAR LastPeriod = MAX(Date[MonthNum])
VAR ForecastPeriod = LastPeriod + 1  -- Next month
VAR N = COUNTROWS(VALUES(Date[Month]))
VAR SumX = SUMX(VALUES(Date[MonthNum]), Date[MonthNum])
VAR SumY = SUMX(VALUES(Date[Month]), [Monthly Sales Qty])
VAR SumXY = SUMX(VALUES(Date[Month]), Date[MonthNum] * [Monthly Sales Qty])
VAR SumX2 = SUMX(VALUES(Date[MonthNum]), Date[MonthNum]^2)
VAR Slope = DIVIDE(N*SumXY - SumX*SumY, N*SumX2 - SumX^2, 0)
VAR Intercept = DIVIDE(SumY - Slope*SumX, N, 0)
RETURN Intercept + Slope * ForecastPeriod

Azure ML-Bedarfsprognose

Für anspruchsvolle Bedarfsprognosen integrieren Sie Azure Machine Learning:

  1. Trainieren Sie ein Prophet- oder ARIMA-Modell anhand historischer Nachfragedaten in Azure ML
  2. Stellen Sie es als Azure ML-Webdienst bereit
  3. Aufruf aus Power BI-Datenflüssen mithilfe der AI Insights-Integration
  4. Oberflächenprognosewerte als Spalte in der Artikeldimension

Inventar-Dashboard-Architektur

Seite 1: Zusammenfassung des Executive Inventory

  • Gesamtbestandswert (KPI-Karte mit MoM-Änderung)
  • Lagerumschlag (Messwert im Vergleich zum Branchen-Benchmark)
  • Tage ausstehender Lagerbestand (KPI mit Trend)
  • Anzahl der Artikel mit Fehlbeständen (Warnkarte, rot, wenn >0)
  • SLOB-Wert (KPI mit % der Gesamtsumme)
  • Bestandswert nach Kategorie (Baumkarte)
  • Nachbestellungsbenachrichtigungen (Tabelle: Artikel, QoH, Nachbestellpunkt, Lieferfristen)

Seite 2: ABC-Analyse

  • Pareto-Diagramm (Artikel sortiert nach Umsatz, kumuliert %)
  • ABC-Verteilung (Ringdiagramm: Anzahl und Wert nach Klasse)
  • ABC-XYZ-Matrix (Streudiagramm: Umsatz auf X, CV auf Y, Blasengröße = Aktienwert)
  • Top-A-Artikeltabelle (Artikel, Umsatz, Umsatz, Lagerwert, Marge)

Seite 3: Bestandsüberwachung

  • Heatmap auf Lagerebene (Standort × Kategorie)
  • Unter den Nachbestellpunktartikeln (Tabelle mit Farbe für das Risiko von Fehlbeständen)
  • Zeitleiste für eingehende Bestellungen (Gantt- oder Balkendiagramm)
  • Bestandsalteranalyse (Balkendiagramm: 0-30, 30-60, 60-90, 90+ Tage)

Seite 4: Nachfrage und Prognose

  • Tatsächlicher Bedarf vs. Prognose (Liniendiagramm mit schattierter Prognose)
  • Bedarfsvariabilität nach Kategorie (Boxplot oder Balken mit Fehlerbalken)
  • Saisonale Nachfragemuster (Heatmap: Monate × Wochentag)
  • Top 20 Schnelldreher (Balkendiagramm nach wöchentlich verkauften Einheiten)

Häufig gestellte Fragen

Wie lässt sich Power BI am besten mit einem ERP für Bestandsdaten verbinden?

Die Verbindungsmethode hängt von Ihrem ERP ab. Stellen Sie für Odoo eine direkte Verbindung zu PostgreSQL über ein Lesereplikat her. Verwenden Sie für SAP den SAP HANA-Connector mit Inventar-CDS-Ansichten. Verwenden Sie für NetSuite SuiteAnalytics Connect ODBC. Verwenden Sie für Dynamics 365 Business Central den Business Central-Connector. Verwenden Sie für alle ERP-Verbindungen ein dediziertes Analysebenutzerkonto mit schreibgeschütztem Zugriff auf Bestandstabellen und planen Sie Aktualisierungen außerhalb der Spitzenzeiten, um die ERP-Belastung zu minimieren.

Wie gehe ich mit Multi-Warehouse-Inventar in Power BI um?

Fügen Sie Ihrem Datenmodell eine Standortdimension mit Attributen wie Lagername, Stadt, Land und Typ (Vertriebszentrum, Einzelhandelsgeschäft usw.) hinzu. Alle Inventar-Snapshot-Zeilen enthalten eine LocationID. Erstellen Sie Kennzahlen, die entweder über alle Standorte hinweg aggregieren oder per Slicer nach ausgewähltem Standort filtern. Für die Analyse des lagerübergreifenden Transfers verfolgt die Tabelle „Inventory_Movements“ mit MovementType = „Transfer“ die Lagerbewegungen zwischen Standorten.

Was ist eine gute Lagerumschlagsquote?

Es hängt stark von der Branche ab. Elektronik: 8-15x (hohe Geschwindigkeit, geringe Margen). Lebensmittel/FMCG: 15-30x. Automobilteile: 3-6x. Modeeinzelhandel: 4-8x (saisonal). Industrielle Fertigung: 3-8x. Vergleichen Sie Ihre Fluktuationsquote mit Ihrem Branchen-Benchmark und nicht mit einem allgemeinen Ziel. Ein „ideales“ Verhältnis gleicht das Serviceniveau (Vermeidung von Fehlbeständen) gegen die Lagerkosten (Vermeidung von Überschüssen) aus.

Kann Power BI vorhersagen, wann mir der Vorrat ausgehen wird?

Ja – die Kennzahl „Liefertage“ berechnet, wie viele Tage der aktuelle Lagerbestand bei durchschnittlicher Tagesverkaufsrate abdeckt. Wenn dieser Wert unter Ihre Vorlaufzeit + Sicherheitsbestandspuffer fällt, kann Power BI den Artikel als gefährdet kennzeichnen und ihn in einer Nachbestellungsalarmtabelle anzeigen. Für eine vorausschauende Lagerhaltung integrieren Sie Azure ML-Bedarfsprognosen, um zukünftige Verkäufe zu prognostizieren und zu berechnen, wann das Risiko von Lagerbeständen kritisch wird, basierend auf der prognostizierten und nicht auf der historischen Nachfrage.

Wie soll ich die Bestandsalterung in Power BI visualisieren?

Verwenden Sie ein gestapeltes Balkendiagramm, das den Prozentsatz des Aktienwerts in jedem Altersbereich (0–30 Tage, 31–60, 61–90, 91–180, 180+ Tage) zeigt. Die Alterung wird ab dem Eingangsdatum der ältesten Charge berechnet. Verfolgen Sie diesen Trend im Laufe der Zeit, um zu sehen, ob sich Ihr Alterungsprofil verbessert (Richtung neuerer Bestände) oder verschlechtert (Anhäufung älterer Bestände). Markieren Sie 90+-Tage-Aktien in Rot als SLOB-Risikoindikator.


Nächste Schritte

Effektive Bestandsanalysen in Power BI reduzieren die Lagerkosten, verhindern Fehlbestände und verbessern den Cashflow – die drei Kennzahlen, die für die Führung der Lieferkette und des Betriebs am wichtigsten sind. Das richtige Datenmodell (Momentaufnahme-basierte Lagerbestände, bewegungsbasierte Flussanalyse) ist die Grundlage, auf der alles andere aufbaut.

Das Power BI-Team von ECOSIRE erstellt Lieferketten- und Bestands-Dashboards, die mit Ihren ERP-Systemen – Odoo, SAP, NetSuite, Dynamics 365 und anderen – verbunden sind. Wir implementieren ABC-Analysen, Nachbestellungswarnsysteme und die Visualisierung von Bedarfsprognosen als produktionsbereite Dashboards.

Entdecken Sie unsere Power BI-Dashboard-Entwicklungsdienste für die Implementierung von Supply-Chain-Analysen oder kontaktieren Sie unser Team, um Ihre Bestandsdatenquellen und Analyseanforderungen zu besprechen.

E

Geschrieben von

ECOSIRE Research and Development Team

Entwicklung von Enterprise-Digitalprodukten bei ECOSIRE. Einblicke in Odoo-Integrationen, E-Commerce-Automatisierung und KI-gestützte Geschäftslösungen.

Chatten Sie auf WhatsApp