2017-11-01 10 views
1

Normalerweise werden PivotTables verwendet, um Daten in einer bestimmten Reihenfolge darzustellen. Für dieses spezielle "Problem" muss ich Zahlen und ein Ziel präsentieren. Dies führt zu Konflikten in Pivots, da der Prozentsatz der Spalte auch das Ziel berücksichtigt.Power Query Excel zeigt Werte als Prozentsatz der Spalte an

Kein Problem, mit PowerPivot sollte es möglich sein, dieses Problem zu beheben. Bisher konnte ich eine Tabelle mit dem folgenden Layout erstellen:

  1  2 3 
cat A 5 10 7 
cat B 10 8 9 
cat C 0  2 1 

Wo 1, 2 und 3 sind die ersten drei Tage eines Monats (der Einfachheit halber Rest wird ausgelassen).

kann ich Summen der Spalten erhalten wie folgt:

= Table.FromRows({List.Transform({"1","2","3"}, each List.Sum(Table.Column(prevStep, _)))}, {"1","2","3"}) 

Weiterhin jeder Wert einer Spalte durch eine Zahl zu teilen, ich bin in der Lage:

= Table.TransformColumns(prevStep, List.Transform({"1","2","3"}, each {_, (this) => this/42, type number})) 

Nun möchte Ich mag 42 ersetzen mit den Summen, die zuvor für die Spaltenspalten berechnet wurden. Beachten Sie, dass "{" 1 "," 2 "," 3 "} automatisch in einem anderen Schritt berechnet werden.

Kann jemand erarbeiten, wie man das erreicht? Erwartetes Ergebnis:

  1  2 3 
cat A 0.33 0.5 0.41 
cat B 0.67 0.4 0.53 
cat C 0  0.1 0.06 

Antwort

0

@Marc Pince; Danke für deine Vorschläge. Nach einiger struggeling war ich in der Lage folgendes zu kochen:

Zuerst tauschte ich die Gesamtzeilensummenberechnung wie folgt zusammen:

totMinDay = Table.ToRows (Table.FromRows({List.Transform(daysOfMonth , each List.Sum(Table.Column(prevStep, _)))}, daysOfMonth)){0}, 

Wo daysOfMonth die Tage des aktuellen Monats sind, an anderer Stelle erhalten.

Als nächstes berechne ich den Prozentsatz wie folgt:

perc= Table.TransformColumns(prevStep, List.Transform(daysOfMonth , each {_, (this) => Number.Round(this/ (totMinDay {Number.FromText(_) - 1}), 3), type number})), 

Hier verwende ich die Tatsache, dass der Index der Summe am Tag des Monats basiert minus 1 (beginnend bei Null) solide Ergebnisse liefert.

Danke für alle Eingaben.

+0

Schöne, prägnante Lösung! –

0

Ich konnte nicht mit einem Weg, um einfach 42 in Ihrem Code zu ersetzen, aber da ich sah diese Matrix Mathe war ich anhand dieser untenen Lösung für Ihr Problem auf Gil Raviv's blog on matrix multiplication.

ich mit diesem als Table1 begann: auf diese

enter image description here

Dann zu bekommen ...

enter image description here

... Ich benutze Tabelle 1 als Quelle für eine neue Abfrage, und dieser Code:

let 
    Source = Table1, 
    #"Removed Columns" = Table.RemoveColumns(Source,{""}), 
    MatrixA = Table.TransformColumnTypes(#"Removed Columns",{{"1", type number}, {"2", type number}, {"3", type number}}), 
    Summed = Table.FromRows({List.Transform({"1","2","3"}, each List.Sum(Table.Column(MatrixA, _)))}, {"1","2","3"}), 
    MatrixB = Table.TransformColumnTypes(Summed,{{"1", type number}, {"2", type number}, {"3", type number}}), 
    IndexedMatrixA = Table.AddIndexColumn(MatrixA, "Index", 1, 1), 
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(IndexedMatrixA, {"Index"}, "Attribute", "Value"), 
    #"Changed Type" = Table.TransformColumnTypes(#"Unpivoted Other Columns",{{"Attribute", Int64.Type}}), 
    RenamedColumnsMatrixA = Table.RenameColumns(#"Changed Type",{{"Index", "Row"}, {"Attribute", "Column"}}), 
    IndexedMatrixB = Table.AddIndexColumn(MatrixB, "Index", 1, 1), 
    #"Unpivoted Other Columns1" = Table.UnpivotOtherColumns(IndexedMatrixB, {"Index"}, "Attribute", "Value"), 
    #"Changed Type1" = Table.TransformColumnTypes(#"Unpivoted Other Columns1",{{"Attribute", Int64.Type}}), 
    RenamedColumnsMatrixB = Table.RenameColumns(#"Changed Type1",{{"Index", "Row"}, {"Attribute", "Column"}}), 
    #"Merged Queries" = Table.NestedJoin(RenamedColumnsMatrixA,{"Column"},RenamedColumnsMatrixB,{"Column"},"RenamedColumnsMatrixB",JoinKind.LeftOuter), 
    #"Expanded RenamedColumnsMatrixB" = Table.ExpandTableColumn(#"Merged Queries", "RenamedColumnsMatrixB", {"Row", "Column", "Value"}, {"B.Row", "B.Column", "B.Value"}), 
    #"Added Custom" = Table.AddColumn(#"Expanded RenamedColumnsMatrixB", "AB", each [Value]/[B.Value]), 
    #"Grouped Rows" = Table.Group(#"Added Custom", {"Row", "B.Column"}, {{"AB", each List.Sum([AB]), type number}}), 
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Grouped Rows", {{"B.Column", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Grouped Rows", {{"B.Column", type text}}, "en-US")[B.Column]), "B.Column", "AB"), 
    #"Added Index" = Table.AddIndexColumn(#"Pivoted Column", "Index", 1, 1), 
    IndexedSource = Table.AddIndexColumn(Source, "Index", 1, 1), 
    #"Merged Queries1" = Table.NestedJoin(#"Added Index",{"Index"},IndexedSource,{"Index"},"IndexedSource",JoinKind.LeftOuter), 
    #"Expanded IndexedSource" = Table.ExpandTableColumn(#"Merged Queries1", "IndexedSource", {""}, {"Column1"}), 
    #"Removed Columns1" = Table.RemoveColumns(#"Expanded IndexedSource",{"Row", "Index"}), 
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns1",{"Column1", "1", "2", "3"}) 
in 
    #"Reordered Columns" 

Sie werden bemerken, ich irgendwie „sprang um“ ein wenig, frühere Applied Schritten als „Tabellen“ im Code ... wie in diesen Applied Schritte (das sind im Grunde Tabellenstatus abfragen):

  • Index MatrixB (IndexedMatrixB = Table.AddIndexColumn(MatrixB, "Index", 1, 1),, wobei MatrixB ein vorheriger angewandter Schritt ist); und

  • Zusammengeführte Abfragen (#"Merged Queries" = Table.NestedJoin(RenamedColumnsMatrixA,{"Column"},RenamedColumnsMatrixB,"Column"},"RenamedColumnsMatrixB",JoinKind.LeftOuter),, wobei RenamedColumnsMatrixA und RenamedColumnsMatrixB vorherige angewandte Schritte sind).

Verwandte Themen