Kostenstellen, Aufbauorganisationen, Stücklisten – Hierarchien kommen überall vor. Im Artikel Was macht eigentlich PATH haben wir gezeigt, was man mit der Funktion PATH machen kann. Eine aktuelle Anfrage eines Lesers nehmen wir zum Anlass, Power Pivot PATH() in diesem Artikel etwas tiefer zu betrachten.
Die Ausgangslage
Wir haben eine Mitarbeiterliste, in der die Mitarbeiter und deren Hierarchie dargestellt ist:
-
Holger (Abteilungsleiter)
-
Marc (Teamleiter)
- Rolf (Verkäufer)
- Martina (Verkäuferin)
-
Sabine (Teamleiterin)
- Linda (Verkäuferin)
- Manfred (Teamleiter)
-
-
Andreas (Abteilungsleiter)
- Dietrich (Teamleiter)
In einer relationalen Struktur stellt man dies wie folgt dar:
ID | ParentID | Name | ||
---|---|---|---|---|
1 | Holger (Chef) | |||
2 | 1 | Marc (Teamleiter) | ||
3 | 2 | Rolf (Verkäufer) | ||
4 | 2 | Martina (Verkäuferin) | ||
5 | 1 | Sabine (Teamleiterin) | ||
6 | 5 | Linda (Verkäuferin) | ||
7 | 1 | Manfred (Teamleiter) | ||
8 | Andreas (Abteilungsleiter) | |||
9 | 8 | Dietrich (Teamleiter) |
Alle Mitarbeiter (auch die Abteilungsleiter und die Teamleiter) arbeiten im Verkauf und haben Umsätze getätigt (der Einfachheit halber immer 100 EUR):
ID | MitarbeiterID | Umsatz | ||
---|---|---|---|---|
1 | 1 | 100 | ||
2 | 2 | 100 | ||
3 | 3 | 100 | ||
4 | 9 | 100 | ||
5 | 5 | 100 | ||
6 | 4 | 100 | ||
7 | 3 | 100 | ||
8 | 7 | 100 | ||
9 | 8 | 100 |
Das Ziel
In einer Pivot-Tabelle sollen die Umsätze pro Mitarbeiter sowie die Umsätze pro Team und pro Abteilung verdichtet dargestellt werden.
Schritt 1: Berechnete Spalten mit PATH() anlegen
Im Artikel Was genau macht eigentlich PATH? wurden die Grundlagen bereits vorgestellt. Mit der PATH-Funktion erstellen wir uns in der Mitarbeiter-Tabelle eine Hierarchie-Spalte:
Auf Basis dieser Spalte können wir dann drei Spalten mit den jeweiligen Leveln erstellen:
Die Mitarbeiter-Tabelle sieht dann wie folgt aus:
Schritt 2: Eine Hierarchie bilden...
...und eine Verknüpfung zu den Transaktionen erstellen:
Schritt 3: eine Pivot-Tabelle erzeugen
Erweiterter Ansatz
Nicht schön sind die leeren Unterzweige. Diese werden aus den Zeilen generiert, bei denen Level 2 oder Level 3 leer sind. Trotzdem liefern diese Werte zurück, da der Mitarbeiter auf höchster Stufe (z.B. Andreas) 100 EUR Umsatz getätigt hat. Um diese los zu werden, fügen wir zunächst eine neue Spalte in die Mitarbeiter-Tabelle ein – die Länge des aktuellen Pfades:
Dann brauchen wir zwei weitere Measures: die aktuelle Tiefe des Baumes BrowseDepth und die maximale Tiefe im aktuellen Filter MaxHierarchyDepth:
Bei BrowseDepth machen wir uns zu Nutze, dass ein Boole'scher Wert addiert werden kann – True wird wie 1, False wie 0 interpretiert.
Den Umsatz unterdrücken bei leeren Subknoten
Damit erstellen wir eine eigene Summe, die BLANK() zurückgibt, wenn wir uns in einem “leeren” Zweig befinden:
Die Erweiterung des erweiterten Ansatzes
Das löst das Problem, dass es keine leeren Unterzweige mehr gibt. Allerdings muss man auch genau hinschauen, wie die Zahlen zu Stande kommen. Bei Andreas steht beispielsweise 200, obwohl die Summe seiner Untergebenen (hier nur Dietrich) eigentlich nur 100 ergeben. Klar, Andreas hat selbst auch 100 EUR Umsatz erwirtschaftet. Rein logisch tritt er damit sowohl als Verkäufer, als auch als Chef auf – und so könnte man das auch darstellen. Dazu füllen wir zunächst die Level mit dem jeweils höheren Level auf, wenn das aktuelle Level leer ist – d.h. die Spalten Level 2 und Level 3 ändern wir auf:
Außerdem fügen wir eine Information ein, ob es sich um das Blatt im Hierarchie-Baum handelt – dabei wird für jeden Satz ermittelt, wie viele Sätze es gibt bei denen der aktuelle Satz Vater ist:
Damit ändert sich die Mitarbeiter-Tabelle: Und den Umsatz berechnen wir dann so:
Damit erhalten wir: Wenn also der Hauptknoten selbst Umsatz generiert hat, erscheint dieser gleichzeitig als Unterknoten.
Kommentar hinterlassen
ich kann die Formel für MaxHierarchyDepth leider nicht finden. Könnten Sie diese bitte noch in den Artikel einbinden? Ansonsten bin ich sehr begeistert von den Erläuterungen.
Viele Grüße Sebastian
Leider funktioniert das bei mir nicht. "BrowseDepth" ist immer 0 egal, ob ich die angegebenen Spalten "Level1", "Level2" und "Level3" in der Pivot-Tabelle als Zeilenfilter verwende bzw. werden die (Leer) Zeilen immer angezeigt. Auch wenn ich mit der Hierarchie arbeite ändert sich daran nichts. Muss noch irgendwo etwas aktualisiert werden? Auch wenn ich jeweils unter "Power Pivot" auf "Alle aktualisieren" klicke passiert auch nichts.
Wird die Funktion ISFILTERED immer getriggert, ohne das man etwas aktualisiert?
Kann man das Beispiel irgendwo herunterladen um es eines zu eins zu vergleichen?
Wäre unendlich dankbar, wenn das bei mir endlich funktionieren würde, teste schon seit Tagen.
Beste Grüsse Adrian
Sehe ich es richtig, dass [UmsatzKomplex] auch ein berechnetes Feld und kein Measure ist? Als Measure konnte ich es nämlich gar nicht erfassen, da ich dort Transaktionen[Umsatz] gar nicht auswählen konnte.
Beste Grüsse
Was ist also, wenn in einer Matrixorganisation die Martina sowohl dem Marc als auch der Sabine untergeordnet ist. Lassen wir mal eine Umsatzverteilung außer acht und nehmen Martinas Umsatz unter beide Vorgesetzten mit auf.
Danke und viele Grüße Dirk
In der Datei gibt es Personen die einer oder mehrerer Gruppen zugeordnet sind. Jede Person erzeugt Umsatz. Der Umsatz kann auf die Person, auf die Gruppe oder als Matrix sowohl der Gruppe und Person zugeordnet werden. Die Summe der Umsätze der Gruppen ist natürlich höher als der Gesamtumsatz. Hilft das weiter? Viele Grüße aus Stuttgart Holger