%3F.png)
Ich versuche, eine Möglichkeit zu finden, Daten in einem hierarchischen Datensatz zu aggregieren, vorzugsweise in einer Pivot-Tabelle, aber andere Methoden könnten auch in Ordnung sein. Stellen Sie sich einen Datensatz vor (für das Beispiel stark vereinfacht), der wie der folgende aussieht. Aus diesen Daten versuche ich, einen Satz von Funktionen zu erstellen, die Fragen wie diese beantworten:
„Wie viel Gesamtbestand habe ich an Obst?“
„Wie viele verschiedene Arten von Lebensmitteln verkaufe ich?“
Item Category
======= ========
Apples Fruit
Bacon Meat
Chicken Meat
Corn Veg
Food
Fruit Food
Grapes Fruit
Meat Food
Squash Veg
Steak Meat
Veg Food
JedeArtikelhat (neben vielen anderen Informationen) eineKategorie, die wir uns wirklich als „Eltern“ vorstellen können. Beachten Sie aber auch, dass innerhalb des Datensatzes alle „Eltern“ auch ihre eigenen Elternkategorien haben. In diesem Datensatz wäre ein Beispiel für einen „Zweig“ der HierarchieLebensmittel->Fleisch->Huhn.
Die Frage „Wie viele verschiedene Obstsorten verkaufe ich?“ zu beantworten, ist nicht schwer, da es sich um eine Kategorie der ersten Ebene handelt. Ich kann einfach die Funktion ZÄHLENWENN verwenden und sagen: „Wie viele Artikel gehören zur Kategorie „Obst“?“ – und ich erhalte eine Tabelle, die folgendermaßen aussieht:
Item Category COUNTIF(categories,me)
Apples Fruit 0
Bacon Meat 0
Chicken Meat 0
Corn Veg 0
Food Food 3
Fruit Food 2
Grapes Fruit 0
Meat Food 3
Squash Veg 0
Steak Meat 0
Veg Food 2
Ganz einfach – in der ersten Zeile sehen Sie einfach, wie oft „Äpfel“ als Kategorie einer anderen Person vorkommt. (Da die Zahl Null ist, weiß ich, dass Äpfel kein übergeordnetes Element sind … das sollte helfen, aber ich bin nicht sicher, wie …) Jetzt erscheint Zeile fünf, „Obst“, zwei Mal als Kategorie einer anderen Person – da die Zahl NICHT Null ist, weiß ich, dass es eine Kategorie und nicht nur ein Element ist. Alles schön und gut für die Mathematik der ersten Ebene, aber …
Dies führt mich zu dem Teil, den ich nicht lösen konnte ...Wie finde ich heraus, wie viele Arten von „Lebensmitteln“ ich INSGESAMT habe? Und da meine tatsächlichen Daten viel mehr Hierarchieebenen haben, muss ich den Baum auf und ab gehen, um herauszufinden, wie viele Kinder insgesamt in jeder Ebene sind. Die Funktion ZÄHLENWENN der ersten Ebene sagt mir, dass es drei Unterkategorien von Lebensmitteln gibt (Obst, Gemüse und Fleisch) – aber was ich wirklich möchte, ist, dass sie irgendwie rekursiv bestimmt, dass Obst, Gemüse und Fleischkönnte auch seinKategorien, und addieren Sie die entsprechenden Zahlen für diese Kinder. In Excel ausgedrückt möchte ich wirklich eine weitere Spalte erstellen können, die rekursiv/iterativ die GESAMTANZAHL der Elemente in diesem gesamten Unterbaum zählt ... in diesem Fall gibt es sieben einzigartige Elemente, die zu Lebensmitteln gehören: 3 Fleisch, 2 Gemüse und 2 Obst.
Einige erschwerende Faktoren:
Da ist keinexplizitKennung in den Daten, die uns mitteilt, ob das bestimmte Element auch eine Kategorie ist oder ob es ein Element der untersten Ebene ist.
Jedes Element kennt nur seine Kategorie/sein übergeordnetes Element – es gibt keine expliziten Daten, die angeben, ob es untergeordnete Elemente hat oder nicht. Anders gesagt: Alle Elemente gehören zu einer Kategorie, aber nur einige Elemente sind auch Kategorien.
In den tatsächlichen Daten kann die übergeordnete Beziehung bis zu 10 Ebenen tief sein, ABER es gibt keine Garantie dafür, dass die Tiefe jedes Zweigs in der Hierarchie konsistent ist: Einige Elemente können 3 Ebenen tief sein, während das nächste 8 Ebenen tief ist.
Das Stamm- oder ultimative übergeordnete Element verfügt nicht über eine Kategorie, aber dies ist ein Einzelfall, den ich problemlos manuell handhaben kann.
Ich bin mir völlig bewusst, dass dies in jeder „echten“ Programmiersprache (Perl, Python usw.) eine triviale Übung wäre, aber letztendlich muss ich dies an jemanden weitergeben, der keine Programmiererfahrung hat, daher gebe ich mir große Mühe, es in eine „Standard“-Excel-Arbeitsmappe einzufügen.
Antwort1
Zunächst einmal stimme ich @Raystafarian voll und ganz zu, Excel ist dafür nicht das richtige Tool.
Wenn Sie es jedoch unbedingt hier tun möchten, finden Sie hier eine Lösung mit einigen Hilfsspalten:
- Ebene: Ebene des tatsächlichen Elements in der Hierarchie (Wurzelelemente haben Ebene 1, die Ebene der untergeordneten Elemente wird erhöht)
=IFERROR(INDEX([level],MATCH([@Category],[Item],0))+1,1)
- Levelcode: laufender Code für jedes Element, eindeutig INNERHALB DER EBENEN
=CHAR(CODE("a")+COUNTIF($C$2:C2,[@level])-1)
- Langer Code: zusammengesetzter Code von übergeordnetem Element und Element
=IF([@level]>1,INDEX([long code],MATCH([@Category],[Item],0)),"")&[@[level code]]
- hat Kind: Boolescher Wert, der angibt, ob das Element ein Kind hat
=COUNTIF([Category],[@Item])>0
Bei diesem Modell enthält eine Kategorie alle Elemente und Unterkategorien, deren Code mit der gleichen Sequenz beginnt wie der Code der Eltern (wenn beispielsweise fruit
der Code von ist aa
, dann haben alle (Enkel-)Kinder davon einen Code, der mit beginnt aa
).
Antworten auf Ihre Fragen:
„Wie viel Gesamtbestand habe ich an Obst?“
=COUNTIFS(Table1[long code],VLOOKUP(I3,Table1,5,FALSE)&"*",Table1[has child],FALSE)
nur gemäß dem Modell, alle Artikel mit derselben Startreihenfolge. Ich zähle hier nicht nur Artikel, nicht Kategorien (Sie verkaufen zwei Obstsorten apples
und grapes
haben kein Produkt, das fruit
Sie verkaufen möchten). Wenn Sie auch Kategorien zählen möchten, schließen Sie einfach den zweiten Teil der Formel aus.
„Wie viele verschiedene Arten von Lebensmitteln verkaufe ich?“
=SUMIF(Table1[long code],VLOOKUP(I10,Table1,5,FALSE)&"*",Table1[inventory])
Ganz ähnlich mitSUMIF
Warnung
Diese Lösung hat zwei Einschränkungen:
- Anzahl der Zeichen: Derzeit beginnt es bei
a
, das den Code 97 hat, und das letzte unterstützte Zeichen inCHAR
der Funktion ist 255. Wenn Sie also auf einer Ebene mehr als 158 verschiedene Kategorien haben, tritt ein Fehler auf (Sie können es etwas erweitern, indem Sie für das erste Zeichen einen kleineren Code verwenden). - mit zunehmender Größe Ihrer Datenbank nimmt die Leistung wahrscheinlich ab (komplexe Berechnungen). Möglicherweise möchten Sie die Berechnungsmethode auf „Automatisch, außer für Datentabellen“ einstellen und die Berechnung nur dann manuell durchführen, wenn Sie sie benötigen.
Antwort2
Ich denke, Máté hat eine gute Antwort. Ich würde es mit Listen machen:
(Alle Array-Formeln, also Ctrl+ Shft+ Enter)
Also, die Formeln (nach unten ziehen)
D2 =INDEX($A$2:$A$12,MATCH(0,IF(ISBLANK($B$2:$B$12),COUNTIF($D$1:$D1,$A$2:$A$12),""),0))
E2 =INDEX($A$2:$A$12,MATCH(0,IF($B$2:$B$12=$D$2,COUNTIF($E$1:$E1,$A$2:$A$12),""),0))
F2 =INDEX($A$2:$A$12,MATCH(0,IF($B$2:$B$12=$E$2,COUNTIF($F$1:$F1,$A$2:$A$12),""),0))
G2 =INDEX($A$2:$A$12,MATCH(0,IF($B$2:$B$12=$E$3,COUNTIF($G$1:$G1,$A$2:$A$12),""),0))
H2 =INDEX($A$2:$A$12,MATCH(0,IF($B$2:$B$12=$E$4,COUNTIF($H$1:$H1,$A$2:$A$12),""),0))
Je nachdem, wie Sie diese sortieren möchten, können Sie auf jeden Fall eine Hierarchie erstellen oder eine Pivot-Tabelle verwenden.
Ich würde den Spalten A und B wahrscheinlich Namen geben, damit Sie mit benannten Bereichen arbeiten können.