Die Auswertung der Auftragsanzahl über zwei oder drei Jahre ist heute Standard. Was aber, wenn die Aufträge völlig unterschiedlich sind? Eine Waschmaschine und eine Tintenpatrone sind einfach zwei Aufträge? Wir zeigen Ihnen, wie man in Power Pivot oder Power BI eine Segmentanalyse durchführt. Und nebenbei lernen Sie die Funktion VALUES() kennen.
Ausgangslage
In der Adventure Works Datenbank von Microsoft finden Sie die Tabelle SalesOrderHeader. In dieser Tabelle werden die Auftragsköpfe verwaltet. Drei Spalten sind für den Moment interessant:
- SalesOrderId – die Auftragsnummer und damit der Schlüssel
- OrderDate – Das Datum der Bestellung für die zeitliche Einordnung
- SubTotal – der Nettowert des Auftrags ohne Fracht, Steuern etc.
Für die zeitliche Einordnung brauchen wir eine Kalendertabelle – die Sie sich, wie in diesem Artikel beschrieben, auch leicht erzeugen lassen können. Unser benötigtes Datenmodell sieht dann wie folgt aus: Mit diesem Datenmodell lässt sich leicht der Verlauf der Auftragsanzahl darstellen:
Segmentierung
Manche Aufträge haben einen Auftragswert von ein paar Euro, manch andere das zehn- oder hundert-fache. Das spiegelt diese Darstellung nicht wieder. Deutlicher wird das, wenn man Auftragssegmente definiert und damit eine Segmentanalyse durchführt. Die Segmente definieren wir beispielsweise über eine Tabelle in Excel. Die können Sie dann direkt ins Datenmodell verknüpfen oder via Power Query ins Datenmodell importieren (ich empfehle mittlerweile immer den Weg über Power Query): Ziel ist es, das jeweilige Segment über einen Slicer auszuwählen und die Entwicklung nur für das gewählte Segment zusehen:
Vorgehen
Die Anzahl Aufträge muss über ein Measure berechnet werden. Das Measure darf dabei nur die Aufträge berücksichtigen, die durch das Segment eingeschränkt sind. Und der Benutzer darf nur ein Segment ausgewählt haben. Sonst ist nicht klar, welche Aufträge gezählt werden sollen und welche nicht.
Die Funktion VALUES()
Hier kommt die Funktion VALUES() ins Spiel. Die Funktion VALUES() gibt eine Liste eindeutiger Werte zurück. Allerdings hat die Funktion noch einen Zusatznutzen: Wenn es nur einen gültigen Wert gibt, dann gibt die Funktion den Wert selbst zurück an Stelle einer Liste mit einer Zeile. Damit dürfen wir folgendes formulieren:
Achtung: Die Einschränkung der Intervalle [von;bis] muss überschneidungsfrei sein. Daher muss SalesOrderHeader[SubTotal] GRÖSSER als “von” und KLEINER/GLEICH “bis” sein, damit Aufträge, deren Wert genau auf der Grenze liegen, nicht doppelt gezählt werden.
HasOneValue()
Die Formel aus dem vorherigen Abschnitt ist noch nicht ganz korrekt. Wenn der Benutzer im Slicer nicht auf einen Eintrag filtert, liefern die beiden Aufrufe von VALUES() mehr als einen Wert zurück. Die Formel verursacht dann einen Fehler. Wir müssen also sicherstellen, dass der Benutzer nur ein Segment ausgewählt hat. Dazu verwenden wir die Funktion HasOneValue():
Wählt der Benutzer im Slicer genau einen Wert aus, dann ist die Rückgabe von HASONEVALUE wahr. Dann ist sichergestellt, dass wir via VALUES() auf “von” und “bis” zugreifen können. Hat der Benutzer nichts gewählt, wird einfach BLANK() zurück geliefert.
Andere Darstellung
Wir müssen nicht mit einem Slicer arbeiten. Der Slicer verdeutlicht die Funktionsweise nur. Wenn wir das Feld “Display” der Tabelle Segmente in das Chart aufnehmen, erhalten wir folgende Darstellung: Warum klappt das? Weil zu jedem Zeitpunkt, in dem unser Measure ausgeführt wird, das Segment eindeutig bestimmt ist. Oder anders gesagt: Die HASONEVALUE-Funktion gibt TRUE zurück. Denken Sie drüber nach
Kommentar hinterlassen
danke für Ihren tollen Blog, die Artikel sind immer sehr informativ und verständlich geschrieben!
Die beschriebene Funktion kann auch als Spaltenformel über die kombinierten Formeln SWITCH, TRUE, AND erreicht werden, z.B. : =SWITCH(TRUE();AND([GesKosten Ist]>=0;[GesKosten Ist]500;[GesKosten Ist]<1001);"500 - 1.000 €";"Mehr als 1.000€")
Aber ein Measure ist natürlich performanter :D
Freundliche Grüße,
Sebastian Bohn
Unabhängig der Performance: Segmente passen sich an - gerade bei Segmentanalysen merkt man schnell, wenn die Intervalle unvorteilhaft sind, zu viele oder zu wenige Segmente definiert sind. Bei der vorgestellten Lösung müssen Sie bzw. Ihre Benutzer keine Formel anpassen. Es muss nur die Segment-Tabelle geändert werden. Die Formeln bleiben unberührt. Und Sie können die Werte der Tabelle "Segmente" als Slicer verwenden.
Viele Grüße Holger Gubbels
auch mit dieser Lösung kann man die Segmente als Slicer verwenden. Die Veränderung der Bänder/Segmente ist natürlich nicht so einfach (für Benutzer ohne PoPi).
Ich habe die Datei jetzt nicht runtergeladen, aber würde diese Spaltenformel auch funktionieren?
formatieren (Komma statt Semikolon).
Mehr Infos
(Semikolon statt Komma).
Mehr Infos
Bitte die anderen Posts löschen, da die Formel nicht korrekt kopiert wurde.
Danke + Grüße,
Sebastian