Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1952to1956
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

meine erste PQ-Abfrage

meine erste PQ-Abfrage
07.11.2023 09:53:42
EasyD
Hallo Forum,

ich habe mir mit viel Geduld und Spucke folgende Datenbankabfrage zusammen gebaut. Meine PQ-Kenntnisse als "bescheiden" zu bezeichnen wäre noch übertrieben, im Moment rate ich mehr als ich gezielt Lösungen finde. Was ich selbst nicht hinbekommen habe, habe ich mir daher von ChatGPT zusammenstellen lassen. Funktioniert weitestgehend, aber - Ich habe im letzten Schritt der Abfrage ("GeänderteSpalten") noch ein Problem zu lösen:

Expression.Error: Ein Wert vom Typ "Function" kann nicht in den Typ "List" konvertiert werden.
Details:
Value=[Function]
Type=[Type]

Mein kompletter Code:

let
Quelle = Table.Combine({#"01R", #"02R", #"03R", #"04R", #"05R", #"06R", #"07R", #"08R", #"09R", #"10R", #"11R", #"12R"}),
GeänderterTyp = Table.TransformColumnTypes(Quelle, {{"Konto", type text}, {"Bezeichnung", type text}, {"Datum", type date}, {"Position", type text}}),

// Hinzugefügte Spalte "KontoBezeichnung" direkt nach "Datum" und "Position" einfügen
HinzugefügteSpalte = Table.AddColumn(GeänderterTyp, "KontoBezeichnung", each [Konto] & " " & [Bezeichnung], type text),

// Reihenfolge der Spalten anpassen
SpaltenNamen = Table.ColumnNames(HinzugefügteSpalte),
ErsteZweiSpalten = List.FirstN(SpaltenNamen, 2),
LetzteSpalte = List.LastN(SpaltenNamen, 1),
RestlicheSpalten1 = List.RemoveItems(SpaltenNamen, ErsteZweiSpalten),
RestlicheSpalten = List.RemoveItems(RestlicheSpalten1, LetzteSpalte),
NeueReihenfolge = ErsteZweiSpalten & {"KontoBezeichnung"} & RestlicheSpalten,
ReihenfolgeAngepasst = Table.ReorderColumns(HinzugefügteSpalte, NeueReihenfolge),
EntfernteSpalten = Table.RemoveColumns(ReihenfolgeAngepasst, {"Konto", "Bezeichnung", "Gesamt"}),

// Ändere den Datentyp der restlichen Spalten ab der vierten Spalte in Dezimalzahlen
SpaltenAbVierter = List.Skip(Table.ColumnNames(EntfernteSpalten), 3), // Überspringe die ersten 3 Spalten
GeänderteDatentypen = Table.TransformColumnTypes(EntfernteSpalten, List.Transform(SpaltenAbVierter, each {_, type number})),

// Definieren Sie Ihre Suchbegriffe und die zugehörigen Vorzeichen
Filterkriterium = {"Erlöse", "Umsatzerlöse", "Erlöse USt-frei", "Provisionserlöse", "Gewährte Skonti, Boni und Rabatte", "Sonstige Erlöse", "Eigenverbrauch", "Summe der Erlöse", "Gesamtleistung", "Rohgewinn", "Zwischensaldo", "Sonstige Erträge", "A.o. Erträge", "Erlöse aus Anlagenverkauf (Buchgewinn)", "Erträge aus Beteiligungen", "Grundstückserträge", "Zinsen und ähnliche Erträge", "Sonstige betriebliche Erträge", "Summe der sonstigen Erträge"},

// Vorzeichenänderung in den ausgewählten Spalten basierend auf den Filterkriterien
GeänderteSpalten = Table.TransformColumns(GeänderteDatentypen, each if List.Contains(SpaltenAbVierter, [Position]) and not List.Contains(Filterkriterium, [Position]) then -_ else _)
in
GeänderteSpalten


Die Vorgehensweise:
Ich kombiniere 12 bestehende Abfragen zu einer einzigen.
Spalten hinzufügen, Reihenfolge ändern, nicht benötigte Spalten entfernen
In den Spalten ab inklusive der 4. Spalte die Datentypen ändern.
Ein Filterkriterium in der Spalte "Position" definieren - die Spalte "Position" ist die zweite Spalte!
Anhand dieses Filterkriteriums die Vorzeichen ändern in den Spalten ab der 4. (die Anzahl dieser Spalten kann variabel sein)! - hier scheitere ich und auch ChatGPT spuckt nur Käse aus!

Meine Frage:
Bis zum Schritt "GeänderteDatentypen" läuft alles wie gewünscht.
Die Liste mit den Filterkriterien ist korrekt.
Wie wende ich den Schritt "GeänderteSpalten " richtig an, sodass er in Spalte 2 schaut ob ein Wert aus den Filterkriterien enthalten ist, um dann in den spalten ab der 4. Spalte die Vorzeichenänderung zu machen?

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: nicht meine erste PQ-Antwort, aber ...
07.11.2023 10:02:02
neopa C
Hallo,

... ohne (D)eine Beispieldatei kann sich da möglicherweise nur ein PQ-Profi eindenken. Ich jedoch habe bestenfalls bescheidene PQ-Erfahrung.

Gruß Werner
.. , - ...
AW: nicht meine erste PQ-Antwort, aber ...
07.11.2023 10:19:13
EasyD
HHmmm... na super - eine Testdatei wäre 27MB groß
Kann man die Größenbeschränkung im Upload irgendwie umgehen? Vermutlich nicht
AW: möglich schon ...
07.11.2023 10:25:00
neopa C
Hallo,

... es müssen ja sicherlich nicht alle Daten sein, die möglicherweise auch noch teilweise zu anonymisieren sind (dafür gibt es ein Tool).

Gruß Werner
.. , - ...
AW: möglich schon ...
07.11.2023 10:31:08
EasyD
Ich glaube, das Problem sind die vielen Abfragen in dem Ding - aber genau um die geht es ja auch.

Ich hab schon Blätter gelöscht
ich hab schon irrelevante Zeilen und Spalten gelöscht
alles erfolglos, bin immer noch bei 25MB

Ich versuche weiter noch irgendwie eine hochladbare Bsp_Datei zu bauen

Was meinst Du für ein Tool?
Anzeige
AW: dazu nun ...
07.11.2023 10:41:24
neopa C
Hallo EasyD,

... damit meinte ich Tool mit dem man sensible Daten, die man nicht ins Internet einstellen möchte einfach anonymisieren kann. Ich hab es nicht, aber ich weiß das es ein solches gibt. Du müßtest nur mal danach im Internet suchen, falls es notwendig sein sollte.

Ich selbst kann mich Deiner Problemstellung wahrscheinlich frühestens am Abend wieder annehmen, weil ich gleich offline gehe. Aber es gibt hier noch mehr User, die auch noch viel mehr PQ-Erfahrung haben als ich, die Dir sicherlich weiterhelfen können.

Gruß Werner
.. , - ...


AW: möglich schon ...
07.11.2023 10:39:41
EasyD
Eine Idee hätte ich noch, weiß aber nicht, ob das funktioniert.

Ich habe die Daten im Grunde schon so aufbereitet, wie ich sie haben will.
Es fehlt nur noch eine Vorzeichenänderung in bestimmten Zeilen und Spalten.

Kann ich die derzeitigen Daten in ein neues Arbeitsblatt laden und anschließend diese Daten mit einer simplen Wenn-Formel bearbeiten?
Wenn Suchbegriff in Spalte Position, dann anderes Vorzeichen...

Das würde bedeuten, ich lade mit die Tabelle in ein Blatt und in einem weiteren Blatt habe ich dann die um die Vorzeichen geänderte Tabelle - das Ergebnis wäre das gleiche, ich hätte nur eine unnütze Tabelle (die aus PQ geladene mit falschen Vorzeichen) in meiner Mappe.

dem steht nichts entgegen oder? Ich meine, wenns mit PQ nicht direkt geht, dann halt so oder?
Anzeige
AW: also eine Vorzeichenänderung ...
07.11.2023 10:47:05
neopa C
Hallo nochmal,

... eine solche kannst Du in PQ doch einfach durch eine benutzerdefinierte Spalte mit IF Then ... else .. vornehmen, wenn der Datentyp der entsprechende Spalte zuvor auch zumindest Zahl ist.

Gruß Werner
.. , - ...
AW: also eine Vorzeichenänderung ...
07.11.2023 11:17:57
EasyD
Ja, könnte ich - ABER:
Ich will die Vorzeichen in ungefähr 50 Spalten ändern.
50 Spalten hinzufügen macht keinen Sinn
Darüber hinaus ist die Anzahl der zu ändernden Spalten durchaus auch variabel - das starre Hinzufügen von Spalten wird also nicht gehen.

Deshalb habe ich zunächst die Datentypen aller Spalten ab Spalte 4 auf Dezimalzahlen geändert.
Anschließend entsprechend der Filterkriterien in der zweiten Spalte (Position) die Vorzeichen in den Spalten ab der 4. Spalte ändern - das war der Plan

Aber Ich dank Dir trotzdem, laut nachdenken hilft meistens und beim quatschen findet man auch Lösungen, nur im Moment leider (noch) nicht!

Anzeige
AW: also eine Vorzeichenänderung ...
07.11.2023 11:56:10
Yal
Moin,

Ich kann es nicht so ganz genau nachvollziehen, aber ich habe die Vorstellung, dass "Erlöse", "Umsatzerlöse", usw. die Spaltennamen darstellen.
Es ist immer schwierig, mit Spalten zu arbeiten, die nicht eindeutig per Name identifiziert werden, auch wenn es hier mit diese ColumnsNames ehr virtuös eingegangen wird.
Viel einfacher und stabiler wäre, diese Spalten zu entpivotieren. Dann wären die Spaltenname der Eintrag in der Spalte "Attribut" (das ist der Default-Name der Spalte, die nach dem Entpiv. den vorigen Spaltennamen enthält) leichter zu identifizieren und zu behandeln.

Auch das Thema der Datentyp "nur ab dem vierte Spalte" wäre damit vereinfacht.

VG
Yal

Anzeige
Jetzt mit Tat
07.11.2023 12:22:23
Yal
Moin,

ich habe eine "01R" aufgebaut (passt wahrscheinlich nicht) und ein bischen rumgespielt.
_ ich mache keine Konto + " " + Bezeichnung (nur fürs Auge, keine Mehrwert. Wennnotwendig, dann nach dem Entpivotieren)
_ Entpivotieren alle Spalten ausser "Konto", "Bezeichnung", "Datum", "Position", neue Spalte heisst "Kennzahl"
_ Filter mit "AddColumn" anstatt "TransformColumns" (weil nicht ganz easy zu behandeln) + alte Wert löschen

let

Quelle = Table.Combine({#"01R"}),
GeänderterTyp = Table.TransformColumnTypes(Quelle, {{"Konto", type text}, {"Bezeichnung", type text}, {"Datum", type date}, {"Position", type text}}),
EntfernteSpalten = Table.RemoveColumns(GeänderterTyp, {"Gesamt"}),
#"Entpivotierte andere Spalten" = Table.UnpivotOtherColumns(EntfernteSpalten, {"Konto", "Bezeichnung", "Datum", "Position"}, "Kennzahl", "alte Wert"),
#"Geänderter Typ" = Table.TransformColumnTypes(#"Entpivotierte andere Spalten",{{"alte Wert", type number}}),

// Definieren Sie Ihre Suchbegriffe und die zugehörigen Vorzeichen
Filterkriterium = {"Erlöse", "Umsatzerlöse", "Erlöse USt-frei", "Provisionserlöse", "Gewährte Skonti, Boni und Rabatte", "Sonstige Erlöse", "Eigenverbrauch", "Summe der Erlöse", "Gesamtleistung", "Rohgewinn", "Zwischensaldo", "Sonstige Erträge", "A.o. Erträge", "Erlöse aus Anlagenverkauf (Buchgewinn)", "Erträge aus Beteiligungen", "Grundstückserträge", "Zinsen und ähnliche Erträge", "Sonstige betriebliche Erträge", "Summe der sonstigen Erträge"},
Vorzeichen = Table.AddColumn(#"Geänderter Typ", "Wert", each if List.Contains (Filterkriterium, [Kennzahl]) then -[alte Wert] else [alte Wert]),
#"Entfernte Spalten" = Table.RemoveColumns(Vorzeichen,{"alte Wert"})
in
#"Entfernte Spalten"


VG
Yal
Anzeige
AW: Jetzt mit Tat
07.11.2023 13:13:20
EasyD
Hey Yal,

das sieht erstmal vielversprechend aus.
Wie schon gesagt - mit PQ bin ich noch ein Dummi, ich werde aber (vermutlich heute abend) mal in Ruhe testen, ob ich deinen Vorschlag eingebaut bekomme.

Vorab zu deinen Anmerkungen:
alles, was in den Filterkriterien gennant ist (Erlöse, Umsatzerlöse usw) findet sich in der zweiten Spalte "Position" und soll als Filterkriterium dienen um die Vorzeichenänderung in den richtigen Zeilen zu machen. Es handelt sich nicht um Spaltenüberschriften.
Die ersten 3 Spaltenüberschriften sind fix, alle Spaltenüberschriften ab der vierten Spalte sind variabel - in diesen Spalten muss die Vorzeichenänderung stattfinden. Und ja - das macht es natürlich schwierig wenn ich nicht eineindeutige Überschriften verwenden kann. Obendrein kann ich die Anzahl dieser Spalten nicht bestimmen, da sie in den Quelldaten (was aus den 12 Einzelabfragen kommt) unterschiedlich viele sein können. Die Änderung der Datentypen musste ich machen, weil in den Quelldaten in diesen Spalten Kauderwelsch ist und daher die Vorzeichenänderung ohnehin nicht funktionieren würde wenn ich es bei den ursprünglichen Datentypen belasse.
Anzeige
AW: Jetzt mit Tat
07.11.2023 14:53:01
Yal
Ok. Jetzt haben wir ein Bischen mehr Infos.

Achte darauf, dass die Daten Spalte in den Vorstufe-Abfragen "01R", "02R", usw. alle dieselbe Namen haben: so werden nach dem Combine alle Daten in einer Spalte zusammengefasst. Es wird dann keine Entpivotieren gebraucht.
Alternativ: "Gesamt" ist wahrscheinlich die Summe. Einfach "Gesamt" behalten, anstatt wegwerfen

Deine Quelle sind wahrscheinlich Tabellen in dem Excel. Dann kannst Du mit
=Excel.CurrentWorkbook()
alle auf einmal haben. Du müsstest diese nach dem Name Fitlern. Idealerweise haben die Name eine erkennbare Muster: "tblJan", "tblFeb", ... weil dein Ergebnis-Tabelle wird auch mitgelesen und muss auf alle Fälle herausgefiltert werden.

Wenn die Kennzahlen schon in einer Spalte sind, dann wie vorab: eine neue Spalte errechnen, die alte wegwerfen. Es ist für PQ Schnuppe, ob in dieselbe oder separate Spalte berechnet wird. PQ macht im Hintergrund seine eigenen Performance-Optimierung.

Ich habe inzwischen die Schreibweise der TransformColumns herausgefunden:
= Table.TransformColumns(#"Geänderter Typ", {"Wert", each if List.Contains (Filterkriterium, [Kennzahl]) then -_ else _})

Die geschweifte Klammer sind relevant, da mehrere Spalten behandelt werden könnten. Ab 2 Spalten müssen diese "gruppiert" werden:
= Table.TransformColumns(TrafoDavor, {{"Spalte1", each _*1}, {"Spalte 2", each _*2}})


Der Link zu alle wesentlichen PQ-Themen: https://excelhero.de/power-query/power-query-ganz-einfach-erklaert/

VG
Yal
Anzeige
AW: Jetzt mit Tat
07.11.2023 16:29:18
EasyD
oooohhh... Yal, da hast Du mich jetzt aber ordentlich gefüttert!
Tausend Dank!
Ich teste und gebe (hoffentlich nicht erst in 3 Wochen) Feedback!

nur noch ein Hinweis:
Die Überschriften in 01R, 02R usw kann ich nicht beeinflussen und die stimmen zwar meistens überein, es ist aber nicht ausgeschlossen, dass in 02 eine Spalte dabei ist, die in 01 noch nicht dabei war.

Warum mache ich diese "Vorab-Abfrage"?
Ganz einfach - es sind Monatstabellen, wie Du schon erkannt hast.
Mein Ziel mit dieser Nummer - nimm Tabelle 01, schreibe in jede Zeile den Monat davor (weil der in der Ursprungstabelle 01 nirgends steht). Anschließend nimm 02, mach das gleiche, anschließend 03 usw - Am Ende dann alle Daten aus allen 12 Tabellen untereinander in einer Gesamttabelle, mit der zusätzlichen Monatsspalte (="Datum" in meiner Gesamtabfrage). In der Gesamtabfrage habe ich dann halt nur noch das zusätzliche Problem mit der Vorzeichenänderung - hätte man auch schon in den Einzeltabellen machen können, war aber (vermutlich) zu rechenintensiv das Ganze 12x zu machen.

Ich Dank Dir!

Anzeige
AW: nachgefragt ...
07.11.2023 17:49:16
neopa C
Hallo Yal,

... ich lerne immer gern dazu. Deshalb meine Bitte an Dich. Kannst Du Deine hierzu erstellte Testdatei mit Deiner PQ-Lösung dazu mal hier hochladen?
Würde mich freuen.

Gruß Werner
.. , - ...
AW: nachgefragt ...
07.11.2023 19:04:34
Yal
ach, leider ungespeichert geschlossen.

Die Datei war nichts besonderes und traff nicht die Vorlage von Easy. Es war nur für die Demonstration des Entpivotierens (siehe gepostete M-Code), was sich als nicht relevant für den Fall erwies.
Da musste lieber Easy eine Version seiner Datei bereitstelllen. 2 Blätter je ein Zeile Daten würde reichen.

@Easy: Ich glaube, was blockiert (wobei ich nur blind erraten kann), ist dass die Daten-Spalten in jeder Abfrage ein anderen Namen haben.
Entweder wird aus diese verschiedenen Spalten eine gemacht (entpivotieren) oder es wird in den "Vorabfragen" ("01R", "02R", ..) eine Verarbeitung vorgenommen, die aus diese Spalte mit Wert und jeweilige Überschrift (Monat "01", "02") zwei Spalten: eine "Monat"-Spalte (Inhalt überall "1", bzw "2" , usw) und ein Spalte mit Werte. Daraus wird durch "Table.Combine" kein Vermehrung von Spalten geben.

VG
Yal
Anzeige
AW: schade. EasyD bat ich ja schon um eine solche owT
07.11.2023 19:07:19
neopa C
Gruß Werner
.. , - ...
AW: nachgefragt ...
08.11.2023 08:25:47
EasyD
Hallo Werner, Hallo Yal,

ich bin dabei, eine neue Datei mit rudimentären Daten zusammen zu basteln damit ich die mal hier hoch laden kann.
Dazu brauche ich aber noch ein bissl, wenn Ihr also noch Geduld habt - es kommen Testdaten!

und tausend Dank für eure Unterstützung!
AW: danke ...
08.11.2023 08:45:40
neopa C
Hallo EasyD,

... ich hab viel Geduld

Gruß Werner
.. , - ...

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige