PQ: Projekt-Arbeitstage berechnen | …Join-Beispiele

Xtract: Am Beispiel der Berech­nung von Arbeit­sta­gen für ein Pro­jekt auf der Basis der gesamten Laufzeit wird haupt­säch­lich über Kom­binieren und per … Join Zusam­men­führen ein Extrakt erstellt.  und berech­net.

  Wis­sens­stand: Lev­el 3 ⇒  Excel GUT!, min­destens Basis-Ken­nt­nisse in Pow­er Query.

Arbeitstage (ohne Feiertage und ohne Betriebsurlaub) mit Power Query berechnen, Linker Anti-Join Join

Laden Sie diese Arbeitsmappe, um das Beispiel bess­er nachvol­lziehen zu kön­nen. Im Blatt Pro­jek­te erken­nen Sie die Dat­en für 3 Pro­jek­te, deren Start- und Ende-Datum und ab Spalte E die Über­schriften für die Monate Okto­ber 2019 bis Dezem­ber 2020 (welche aber umfor­matierte kalen­darische Dat­en des jew­eili­gen Monat­ser­sten sind). In diese Spal­ten sollen die Werte der entsprechen­den Arbeit­stage je Pro­jekt einge­tra­gen wer­den. Im Work­Sheet Arbeits­frei sind die Feiertage (ein­schließlich Heili­ga­bend und Sil­vester) sowie die Zeit des Betrieb­surlaubs einge­tra­gen.

Im ersten Schritt wer­den Sie alle drei tabel­lar­ischen Darstel­lun­gen in eine Intel­li­gente Tabelle for­matieren und diesen Tabellen dann auch einen „sprechen­den” Namen geben. Ich ver­wende Pro­jek­te, Feiertage und Betrieb­surlaub. Anschließend importiere ich diese 3 Tabellen nacheinan­der in Pow­er Query und spe­ichere jede einzelne direkt nach dem Import erst ein­mal als Nur Verbindung ¿. An dieser Stelle aber bere­its ein Hin­weis: Sie fördern die Per­for­mance, wenn Sie den Bere­ich der Intel­li­gen­ten Tabelle Pro­jek­te auf den Bere­ich der Spal­ten A:D (und natür­lich let­zte Daten­zeile) ein­schränken, denn prinzip­iell ist der Bere­ich ab Spalte E in PQ selb­st erst ein­mal über­flüs­sig. Außer­dem ist dann auch der während des Imports wahrschein­liche Hin­weis, dass die Formeln in sta­tis­chen Text umge­wan­delt wer­den, hin­fäl­lig. 😉 Hin­weis: In E1 ste­ht noch ein „nor­males” Datum, in F1:S1 habe ich jedoch die Funk­tion EDATUM() ver­wen­det, welche automa­tisch den Monats­be­ginn des Fol­ge­monats berech­net und als Datum in die Zelle schreibt.

Öff­nen Sie nach dem Import wieder die Abfrage Pro­jek­te, beispiel­sweise durch einen Dop­pelk­lick auf den entsprechen­den Ein­trag im recht­en Seit­en­fen­ster. Soll­ten Sie die Dat­en bis Spalte S importiert haben, dann löschen Sie alle Spal­ten mit den Monats­namen. Und da PQ sehr sub­til zwis­chen den Daten­typen unter­schei­det, for­matieren Sie die Spal­ten Von und Bis als (nur) Datum. Das stellt sich im Anschluss so dar:

Der angepasste Daten­typ des Datums ist aus­ge­sprochen hil­fre­ich

▲ nach oben …

Jeder Tag im Zeitbereich Von … Bis

Im ersten Schritt wer­den Sie für jeden Tag des einzel­nen Pro­jek­ts eine einzelne Daten­zeile gener­ieren. Dabei wer­den erst ein­mal auch Woch­enen­den und Feiertage mit ein­be­zo­gen. Das geschieht ide­al­er­weise so:

  • Wech­seln Sie zum Menü Spalte hinzufü­gen, Benutzerdefinierte Spalte.
  • Im Dia­log bei Neuer Spal­tenname beispiel­sweise Kal. Dat­en ein­tra­gen.
  • Bei Benutzerdefinierte Spal­tenformel tra­gen Sie diese Formel ein:
= List.Dates([Von], Duration.Days([Bis]-[Von])+1, 
#duration(1,0,0,0))

wobei Sie die Über­schriften ein­schließlich der eck­i­gen Klam­mern am ein­fach­sten per Dop­pelk­lick auf den Ein­trag im Bere­ich Ver­füg­bare Spal­ten übernehmen kön­nen (obwohl es natür­lich beque­mer ist, die Funk­tion hier zu kopieren und im Dia­log einzufü­gen). 😎 

Acht­en Sie auch darauf, dass die Sprache M die exak­te Groß- Klein­schrei­bung wie hier dargestellt erfordert. Weit­er geht’s …

  • Nach einem OK ist eine neue Spalte Kal. Dat­en erstellt wor­den, wo in jed­er Zelle dieser Spalte der Begriff, das Schlüs­sel­wort List ste­ht.
  • Erweit­ern Sie die Spalte durch einen Klick auf den Dop­pelpfeil Doppelpfeil  in der Über­schrift und im Kon­textmenü wählen Sie Auf neue Zeilen ausweit­en.
  • Kon­trol­lieren Sie in der jet­zt um reich­lich Zeilen erweit­erte Abfrage, ob der Beginn beim ersten Tag des Zeitraums (Spalte Von) ist, die fol­gen­den paar Zeilen tat­säch­lich jew­eils 1 Tag später sind und ob die let­zte Zeile der jew­eili­gen Pro­jek­t­num­mer auch das Datum aus der Spalte Bis enthält.
  • Löschen Sie die Spal­ten Von und Bis, diese wer­den nicht mehr benötigt. Zugegeben, das ist zu diesem Zeit­punkt noch nicht unbe­d­ingt erforder­lich, sorgt aber für mehr Klarheit bzw. Über­sicht und auch für etwas mehr Per­for­mance des Pro­jek­ts. 💡 

▲ nach oben …

Arbeitstage filtern

Zu diesem Zeit­punkt ste­ht jed­er einzelne Kalen­dertag des Zeit­bere­ichs vom ersten bis zum let­zten Tag des jew­eili­gen Pro­jek­ts in der Abfrage. In den kom­menden Schrit­ten wer­den Sie erst ein­mal die Woch­enen­den her­aus­fil­tern (löschen):

    • Acht­en Sie darauf, das die Spalte Kal. Dat­en markiert ist.
    • Immer noch im Menü Spal­ten hinzufü­gen wählen Sie Datum | Tag | Name des Tags, um eine Spalte mit dem Namen des Wochen­t­ages einzufü­gen.
    • Fil­tern Sie diese neu einge­fügte Spalte so, dass Sie bei Sam­stag und Son­ntag das Häkchen ent­fer­nen.

Der Erfolg dieser Aktion ist, dass die Abfrage statt 847 nun nur noch 604 Zeilen enthält. Auch diese Spalte mit den Namen der Wochen­t­age wird jet­zt nicht mehr benötigt, sie kann (und sollte) also eben­falls gelöscht wer­den.

Zum derzeit­i­gen Stand sind ja in der Abfrage immer noch die Feiertage und auch die arbeits­freie Zeit der Betrieb­s­fe­rien aufge­führt. Und in diesem Fall wird es dann auch etwas anspruchsvoller, was die Vorge­hensweise bet­rifft. – Falls das linke Seit­en­fen­ster mit der Auflis­tung der Abfra­gen nicht sicht­bar ist, blenden Sie es ein. ¿ Klick­en Sie hier auf den Ein­trag Feiertage, um rasch zu dieser Abfrage zu wech­seln. Im ersten Schritt ändern Sie auch hier den Daten­typ der Spalte FT Datum auf Datum, damit die Daten­typen zu denen in der Abfrage Pro­jek­te iden­tisch sind.

Sie haben jet­zt noch die Gele­gen­heit, in der Abfrage die Zeilen 15;18 (24. und 31. Dezem­ber) zu löschen, falls an diesen „unecht­en” Feierta­gen doch gear­beit­et wird. ¿ Natür­lich kön­nen Sie auch die Quell­dat­en entsprechend anpassen; nach dem erneuten Öff­nen und einem eventuellen Aktu­al­isieren sind die bei­den Tage dann auch nicht mehr in der Query. Hin­weis in Sachen „Anzahl der Daten­sätze: Ich belasse es bei den bei­den „unecht­en” Feierta­gen, denn meis­tens wird dann in der Ver­wal­tung nicht gear­beit­et.

Wech­seln Sie per Klick im linken Seit­en­fen­ster wieder zur Query Pro­jek­teHome (bzw. Start) | Kom­binieren | Abfra­gen zusam­men­führen und es öffnet sich ein Dialogfen­ster. Wählen Sie im kleinen Textfeld unter­halb Pro­jek­te die Abfrage Feiertage. Der untere große Kas­ten wird automa­tisch aus­ge­füllt und das stellt sich nun so dar:

Direkt nach Auswahl der zu verknüpfend­en Abfrage ist OK noch deak­tiviert

Im fol­gen­den Schritt muss fest­gelegt wer­den, welche Felder für einen Ver­gle­ich verknüpft wer­den sollen. Und dafür eignet sich natür­lich nur das Datum. Markieren Sie also bei Pro­jek­te das Feld Kal. Dat­en und bei Feiertage FT Datum. Klick­en Sie nun in die jew­eilige Spalte, die anschließend kom­plett markiert sein wird.

Danach müssen Sie noch fes­tle­gen, wie die Verknüp­fung gestal­tet wer­den muss. Die Vor­gabe Link­er äußer­er Join ist nicht zielführend, da dann alle Daten­sätze aus der ersten (oberen) Abfrage ver­wen­det wer­den wür­den und (zusät­zlich, falls nicht vorhan­den) die übere­in­stim­menden Werte aus der zweit­en (unteren) Query. Da die Feiertage ja (teil­weise) bere­its eine Unter­menge der Pro­jekt-Dat­en sind wür­den sich keine Änderun­gen in der Anzahl ergeben; schließlich wollen Sie ja nicht eine zusät­zliche Spalte mit den Beze­ich­nun­gen der Feiertage erstellen … 😎 

Sie wollen im End­ef­fekt ja nur die kalen­darischen Dat­en in der ersten Abfrage behal­ten, die nicht in der unteren Abfrage (mit den Feierta­gen) enthal­ten, also dort aufge­führt sind. Und wenn Sie die Vor­gabe der Zeile Join-Art erweit­ern, dann wer­den Sie bei der Auswahl Link­er Anti-Join  … fündig. Es bleiben jene Zeilen erhal­ten, die beim ver­Link­ten Feld nur in der ersten Abfrage vorhan­den sind:

22 von den 604 Zeilen der ersten Query wer­den aus­geschlossen (nicht über­nom­men, gelöscht)

In der Sta­tuszeile des Pow­er Query-Edi­tors erken­nen Sie nach dem Schließen des Dialogs, dass nur noch 582 Zeilen vorhan­den sind. Das stimmt also schon ein­mal. Die neu erstellte Spalte Feiertage enthält auss­chließlich den Wert Table. Erweit­ern Sie diese Spalte durch einen Klick auf das Dop­pelpfeil-Sym­bol Doppelpfeil rechts in der Über­schrift. Sor­gen Sie dafür, dass auss­chließlich bei FT Datum das Häkchen geset­zt ist. Diese Spalte enthält naturgemäß auss­chließlich den Wert null, sie ist darum nicht mehr erforder­lich; also ein­fach löschen. 😉

Hin­weis: Wenn Sie etwas mehr Erfahrung mit Pow­er Query gesam­melt haben, wer­den sie die Spalte erst gar nicht erweit­ern son­dern nach dem Abschluss des Kom­binierens und der Kon­trolle auf die ver­min­derten Zeilen gle­ich löschen. Für den Ein­stieg ist aber der etwas län­ger­er Weg des Erken­nt­nis­gewinns wegen dur­chaus hil­fre­ich.

Und nach exakt dem gle­ichen Muster wer­den Sie die die Betrieb­s­fe­rien aus­blenden wollen. Aber ein Blick in die Abfrage wird Ihnen schnell klar machen, dass das irgend­wie nicht hin­hauen kann und auch nicht wird. Im besten Fall (wenn Sie die Formel deut­lich angepasst hät­ten) wer­den 2 kalen­darische Dat­en in der Query enthal­ten sein, es sollen aber natür­lich alle Tage des Betrieb­surlaubs sein; wahrschein­lich aber nur 1 Zeile mit Error als Wert gener­iert. 😕 

▲ nach oben …

Betriebsurlaub, alle Tage als Tabelle generieren

Wech­seln Sie zur Abfrage Betrieb­surlaub. ¿ Ändern Sie auch hier den Daten­typ bei­der Spal­ten auf Datum. Nun Spalte hinzufü­gen, Benutzerdefinierte Spalte und geben Sie im Dia­log beispiel­sweise BU-Datum bei Neuer Spal­tenname ein. Als Benutzerdefinierte Spal­tenformel schreiben Sie exakt diese Funk­tion nach dem Gle­ich­heit­sze­ichen:

= {[Betriebsurlaub von]..[Betriebsurlaub bis]}

… also mit den ein­fassenden geschwun­genen Klam­mern und den 2 Punk­ten zwis­chen den Spal­tenna­men. Falls Sie bere­its etwas mehr Erfahrung mit M-Funk­tio­nen gesam­melt haben wer­den Sie sagen: „Das sollte kor­rekt sein”. Sollte… 😥 Das Ergeb­nis ist ernüchternd. Wie oben schon „ange­dro­ht”: Error… Und wenn Sie in die Zelle mit der Fehler­mel­dung Klick­en, wird auch eine Fehler­analyse angezeigt:

Der Oper­a­tor „..” kann nur auf Zahlen angewen­det wer­den

Speziell für diese Fehler­mel­dung wurde im recht­en Seit­en­fen­ster ein neuer Schritt BU-Datum erzeugt. Löschen Sie diese Zeile, bevor sie weit­er in der Abfrage arbeit­en. – Auch wenn Sie nun vielle­icht denken wer­den, dass in Excel ein Datum doch nur eine anders dargestellte Zahl ist, das trifft zwar auf Excel, nicht jedoch auf Pow­er Query zu. Denn hier sind es zwei dur­chaus unter­schiedliche Daten­typen, die nicht kom­pat­i­bel (miteinan­der vere­in­bar) sind. Vielle­icht ahnen Sie nun, warum ich die Spal­ten mit der Datum/Uhrzeit-For­matierung in „nur” Datum umfor­matiert habe. 💡 

Und wie lässt sich das Dilem­ma beseit­i­gen? Der eine Weg wäre natür­lich, die prak­tisch gle­iche Vorge­hensweise wie bere­its gehabt anwen­den. Also im recht­en Seit­en­fen­ster ein Dop­pelk­lick auf den zulet­zt pro­tokol­lierten Schritt und erset­zen Sie die Formel hier­mit:

= List.Dates([Betriebsurlaub von], 
Duration.Days([Betriebsurlaub bis]-[Betriebsurlaub von])+1, 
#duration(1,0,0,0))

Und das klappt dann auch, die erweit­erte Spalte BU-Datum ist kor­rekt. Wenn Sie den­noch die vorher gel­ernte Form(el) mit den 2 Punk­ten anwen­den wollen müssen Sie grund­sät­zlich dafür sor­gen, dass die bei­den Datum­swerte in eine Ganz­zahl umge­wan­delt wer­den. Das geht mit ein­er Folge von (ver­schachtel­ten) Funk­tio­nen, welche die Werte vom Typ Datum in eine Ganz­zahl umwan­deln. Siehe etwas weit­er unten …


Für Ein­steiger in Sachen PQ ist es gewiss der ein­fach­ste Weg, erst den Daten­typ der bei­den Spal­ten auf Ganze Zahl anzu­passen, die erst­ge­nan­nte Formel anzuwen­den und anschließend entwed­er alle drei oder nur die neu erstellte Spalte wieder als Datum deklar­i­eren. Und jet­zt wer­den Sie das gle­iche Pro­cedere durch­führen wie beim Kom­binieren der ersten Abfrage mit den Dat­en der Abfra­gen Pro­jek­te und Feiertage. Auch hier wer­den Sie die neu gener­ierte Spalte mit dem Inhalt Table löschen.


Wenn Sie eine fort­geschrit­tene Funk­tion­al­ität nutzen wollen bietet sich an, erst ein­mal die (noch) fehler­hafte Formel mit den 2 Punk­ten in den Edi­tor zu schreiben. Den ersten Teil wer­den Sie dann in eine einzige kom­binierte Funk­tion „pack­en”. Erstellen Sie eine neue Benutzerdefinierte Spalte und tra­gen bei der Spal­tenüber­schrift einen beliebi­gen Wert ein oder belassen Sie es bei Benutzerdefiniert. Ergänzen bzw. ändern Sie die fehler­hafte Formel so:

= {Number.From([Betriebsurlaub von])..Number.From([Betriebsurlaub bis])}

… dann wird eine neue Spalte mit den numerischen Werten der kalen­darischen Dat­en erstellt. OK und Sie erweit­ern die neue Spalte BU-Datum wie gehabt durch einen Klick auf den Dop­pelpfeil in der Über­schrift und Auf neue Zeilen ausweit­en. Nach ein­er Umwand­lung in den Daten­typ Datum ist der gewün­schte Erfolg auch hier gegeben.

Wie auch immer ihre Abfrage in Sachen Betrieb­surlaub derzeit aussieht, es sollte im End­ef­fekt nur die Spalte BU-Datum existieren. Löschen Sie also erforder­lichen­falls die bei­den Spal­ten Betrieb­surlaub von und Betrieb­surlaub bis. Prinzip­iell ist dieser Schritt wiederum wegen der besseren Per­for­mance sin­nvoll.

Und natür­lich wer­den Sie auch in dieser Sit­u­a­tion diese Tabelle mit der Abfrage Pro­jek­te der­art Kom­binieren, dass auch die Tage des Betrieb­surlaubs aus der Abfrage Pro­jek­te her­aus­ge­filtert wer­den. Die Vorge­hensweise ist mit der bei den Feierta­gen iden­tisch, nur dass Sie hier als zweite Abfrage Betrieb­surlaub und die Spalte BU-Datum nutzen.

▲ nach oben …

Eine erste Auswertung

Zu diesem Zeit­punkt befind­en sich in 542 Zeilen alle erforder­lichen Dat­en in der Abfrage Pro­jek­te. Die Woch­enen­den, der Betrieb­surlaub und die Feiertage sind aus den kalen­darischen Dat­en ent­fer­nt. Wenn es Ihnen auss­chließlich darum geht, die Gesamt-Anzahl der Arbeit­stage für jedes der Pro­jek­te zu erfassen, reicht in vie­len Fällen eine ein­fache tabel­lar­ische Auswer­tung. Gehen Sie dazu so vor:

  • Um die Basis-Dat­en der Abfrage Pro­jek­te zu erhal­ten, erstellen Sie von dieser Abfrage ein Dup­likat. – Ide­al­er­weise wer­den sie dieser Kopie beispiel­sweise den Namen Pro­jek­te (kumuliert) statt Pro­jek­te (2) geben, der Deut­lichkeit wegen. 😉 
  • Markieren Sie nacheinan­der die Spal­ten Pro­jekt Nr. und Pro­jekt Beze­ich­nung.
  • Recht­sklick in eine der bei­den Über­schriften und wählen Sie dann im Kon­textmenü Grup­pieren nach…
  • Übernehmen Sie die Vor­gaben und schließen Sie dieses Fen­ster durch einen Klick auf OK.

Das Ergeb­nis stellt sich so dar:

Das Ergeb­nis: Die Gesamt-Anzahl aller einzel­nen Pro­jek­te

▲ nach oben …

Übersicht der Anzahl (Projekttage)

Sollte dieses soeben erar­beit­ete Ergeb­nis aus­re­ichend sein oder Sie brauchen auch nur dieses For­mat der Auswer­tung (also in diese Darstel­lung), dann kön­nen Sie dieses Ergeb­nis per Schließen & laden oder Schließen & laden in… in ein Excel – Tabel­len­blatt spe­ich­ern. Alter­na­tiv ein­fach als Nur Verbindung spe­ich­ern, ohne die Query in ein Work­Sheet zu schreiben. Die Auf­gabe wäre damit gelöst.

Monatliche Auswertung (grob)

Die eigentliche Forderung des Fragestellers für die Auswer­tung war aber, dass die monatlichen, nicht die gesamten Arbeit­stage berech­net wer­den. Und um das zu erre­ichen, wech­seln Sie noch ein­mal zur Abfrage Pro­jek­te oder öff­nen diese durch einen Klick im linken Seit­en­fen­ster. Da die meis­ten Schritte zu ein­er neuen Auswer­tung auf der beschriebe­nen Basis bere­its erfol­gt sind, Duplizieren Sie diese Abfrage ¿ auf beliebigem Wege. Ich gebe dieser neu erstell­ten Query aus Grün­den der Über­sichtlichkeit einen anderen Namen. Statt der ange­hängten (2) schreibe ich nach dem Namen der Query beispiel­sweise (monatliche Liste). Sie könen direkt an dieser Posi­tion weit­er­ma­chen.

Sie wer­den nun je eine neue Spalte ein­richt­en, wo der Monat­sname und das Jahr berech­net wer­den. Auch wenn es ein klein­er Umweg ist werde ich mit Ihnen zu Beginn zwei Spal­ten gener­ieren und diese dann zum Wun­sch-Ergeb­nis verbinden. Ich denke, dass diese Vorge­hensweise leichter nachvol­lziehbar ist, als alles „in einem Rutsch” zu machen.

  • Markieren Sie die Spalte Kal. Dat­en.
  • Wech­seln Sie zum Menü Spalte hinzufü­gen und wählen Datum | Monat | Name des Monats.
  • Lassen Sie die Spalte Kal. Dat­en markiert, Datum | Jahr | Jahr.
  • Markieren Sie nun zuerst die Spalte Monat­sname und anschließend mit Strg oder mit Shift die Spalte Jahr.
  • Trans­formieren | (Gruppe) Textspalte | Spal­ten zusam­men­führen und wählen Sie im Dia­log als Trennze­ichen das Leerze­ichen.
  • Bei Neuer Spal­tenname gebe ich entwed­er Monat & Jahr oder MMMM JJJJ ein. Die zwei markierten Spal­ten wer­den nun zu ein­er einzi­gen zusam­menge­fasst und dort ste­ht zu jedem Tag die aus­geschriebene Monats­beze­ich­nung und durch ein Leerze­ichen getren­nt das Jahr.

Löschen Sie nun die Spalte Kal. Dat­en. Markieren Sie (von links nach rechts !) alle drei Spal­ten ¿ und führen Sie in ein­er der markierten Über­schriften einen Recht­sklick durch. Im Kon­textmenü wählen Sie dann Grup­pieren nach… Übernehmen sie die Vor­gaben des Dialogs und Sie wer­den erken­nen, dass für jeden Monat die Anzahl der entsprechen­den Arbeit­stage berech­net wurde. Für die kom­pak­te Über­sicht als 30-zeilige Liste sollte das abso­lut aus­re­ichen. Schließen & laden oder Schließen & laden in… und auch diese Abfrage hat ihren Platz im Excel-Work­book oder auch nur im Arbeitsspe­ich­er gefun­den. 😉

▲ nach oben …

Wunschergebnis Kreuztabelle

Ein Blick auf das Excel-Arbeits­blatt Pro­jek­te zeigt ganz klar auf, dass die eigentliche Wun­schvorstel­lung eine Kreuzta­belle und keine Liste ist. Die Monate sollen also in Spal­ten dargestellt wer­den und die Pro­jek­te sowie die dazuge­höri­gen berech­neten Arbeit­stage in den zum Monat passenden Zeilen. Die Basis ist bere­its gelegt und die zulet­zt erstellte Abfrage kann und sollte dafür vor­be­halt­los ver­wen­det wer­den.

Wenn Sie das Ergeb­nis und vor allen Din­gen auch den zielführen­den Weg der zulet­zt erstell­ten Abfrage erhal­ten (also nicht ver­w­er­fen) wollen, dann wer­den sie von dieser Abfrage ein Dup­likat erstellen (obwohl Sie diese Abfrage nur min­i­mal ergänzen wer­den). Den Namen dieser Query passen sie entsprechend an, ich schreibe dort zwis­chen die Klam­mern das Wort (Kreuzta­belle) und lösche natür­lich  die vorheri­gen Werte zwis­chen den Klam­mern. Der Weg zum Ziel ist nun gewiss deut­lich unkom­pliziert­er, als sie es sich vielle­icht vorstellen.

  • Markieren Sie die Spalte mit den Monats­beze­ich­nun­gen (z.B. MMMM JJJJ) und wech­seln Sie zum Menü Trans­formieren.
  • Suchen Sie dort in der Gruppe Beliebige Spalte das Sym­bol für Piv­otieren ; ein Klick darauf und im Dialogfen­ster wählen Sie bei Wertes­palte die Zeile Anzahl.
  • Kon­trol­lieren Sie, ob bei Erweit­erte Optio­nen der Wert Summe vorgegeben ist, erforder­lichen­falls wählen Sie diesen Ein­trag.
  • Jet­zt nur noch OK und das war’s auch schon. Das erwün­sche Ergeb­nis erken­nen Sie sofort in der Abfrage. Wenn Sie nun diese Abfrage in ein Arbeits­blatt über­tra­gen, haben Sie die Auf­gabe erfüllt. Es sei denn …  

▲ nach oben …

Die Lösung für Puristen

… es sei denn, Sie möcht­en eine qua­si per­fek­te Lösung. 😛 Ich finde, dass die bis hier­her erar­beit­ete Lösung gut ist. Aber wenn Sie genau hin­se­hen wer­den Sie erken­nen, dass es doch einen kleinen Unter­schied zwis­chen Ihrem bish­eri­gen Ergeb­nis und der Wun­schvorstel­lung gibt. In den Quell­dat­en ist der (kalen­darische) Daten­bere­ich von Okto­ber 2019 bis Dezem­ber 2020 angegeben, Ihr (eigentlich unser) Ergeb­nis begin­nt aber im Novem­ber 2019 und endet auch im Dezem­ber 2020.

Zugegeben, eine einzige Spalte hinzuzufü­gen ist auch in PQ prinzip­iell kein wirk­lich­er Aufwand. Aber stellen Sie sich ein­fach ein­mal vor, dass in dieser Auf­gabe das Geschäft­s­jahr am 1. Okto­ber begin­nt und am 30. Novem­ber endet. Dann müssten ja neben dem Okto­ber 2019 noch die Monate Jan­u­ar bis Novem­ber 2021 in die Liste bzw. auch Kreuzta­belle einge­fügt wer­den. Und des Lern­ef­fek­ts wegen soll­ten Sie auch diesen Schritt vol­lziehen.

Nein, den „Schle­ich­weg” werde ich Ihnen zwar sagen aber das wäre dann nun wirk­lich nicht der gewollte Lern­ef­fekt. Sie kön­nten ja in Excel eine Liste nach dem Muster der Ursprungs­dat­en mit der Funk­tion EDATUM() erstellen, die den eben ange­sproch­enen Zeitraum umfasst. Diese Liste kön­nten Sie importieren und dann an dieser Stelle weit­er arbeit­en.

Eine Abfrage per Power Query erstellen

Sie kön­nen auch in Pow­er Query autonom eine Abfrage erstellen, also ohne den Import extern­er Dat­en. Wech­seln Sie dazu erst ein­mal zum Menü Home. Ganz rechts in der Gruppe Neue Abfrage erweit­ern Sie Neue Quelle | Andere Quellen | Leere Abfrage. PQ legt eine neue, leere Abfrage an, welche sich aus­ge­sprochen unschein­bar darstellt:

Das leere Gerüst ein­er neuen, inter­nen Abfrage

Inter­es­sant … Im linken Seit­en­fen­ster ist die neu erstellte Abfrage noch durch grüne Hin­ter­legung markiert und der eigentliche Abfrage-Bere­ich „glänzt” durch Leere. In der Eingabezeile ste­ht (natür­lich) auch nichts, denn es gibt ja noch keine Dat­en. Das lässt sich aber recht schnell und auch unkom­pliziert ändern. Geben Sie in die Eingabezeile die fol­gende Formel mit dem führen­den Gle­ich­heit­sze­ichen in exakt der dargestell­ten Groß- Klein­schrei­bung ein:

= {Number.From(#date(2019,10,1))..Number.From(#date(2021,09,30))}

Prinzip­iell ken­nen Sie den Auf­bau solch ein­er Formel, die Funk­tion #date() sollte auf­grund der hier dargestell­ten Dat­en selb­sterk­lärend sein. Anson­sten bietet hier Microsoft eine gute Hil­fe für diese Funk­tion im Inter­net an. Nach einem Klick in den leeren Bere­ich unter­halb der Eingabezeile oder ein­fach auch nur Zeilen­schal­tung / Enter erstellt Pow­er Query eine Liste aller Tage des angegebe­nen Bere­ichs, hier allerd­ings als „serielle Zahl”. Da eine Typ-Umwand­lung bei ein­er PQ-Liste nicht direkt möglich ist und die Dat­en sowieso später als Abfrage vor­liegen müssen, Klick­en Sie im Menüband auf die Schalt­fläche Zu Tabelle und übernehmen Sie die Vor­gaben des Dialogs ohne Änderung. Jet­zt ändern Sie den Daten­typ der einzi­gen Spalte auf Datum.

Es liegt in der Natur der Sache, dass hier entsch­ieden zu viele Dat­en gener­iert wor­den sind; mehr als 30 mal zu viel, denn Sie brauchen ja nur den jew­eils Monat­ser­sten. Auch hier führen viele Wege zum Ziel. Ich denke, dass fol­gende Vorge­hensweise ein hohes Maß an Trans­parenz bietet:

  • Markieren Sie erforder­lichen­falls die einzige Spalte Column1.
  • Menü Trans­formieren, Datum | Monat | Monats­be­ginn sorgt dafür, dass für jedes bish­erige Datum nur der Monat­ser­ste in der Zelle ste­ht.
  • Recht­sklick in die Über­schrift und Dup­likate ent­fer­nen. Die Abfrage enthält jet­zt noch 24 Zeilen, also sind die Monat­ser­sten exakt bei­der Geschäft­s­jahre erfasst.

Sie haben jet­zt entwed­er die importierte Tabelle aus Excel oder die eben erstellte Abfrage auf dem Bild­schirm. Das weit­ere Vorge­hen ken­nen Sie schon. Sie erstellen über Spalte hinzufü­gen, Datum | Monat | Name des Monats eine neue Spalte und auf die gle­iche Weise eine Spalte für das Jahr. Anschließend die bei­den neu erstell­ten Spal­ten Zusam­men­führen und das Leere­ichen als Tren­ner ver­wen­den. Die erste Spalte mit dem Datum hat ihren Zweck erfüllt und sollte gelöscht wer­den. Wenn Sie möcht­en, kön­nen Sie nun noch die Über­schrift Zusam­menge­führt in beispiel­sweise Monate ändern. Und um kon­se­quent die Namen der Abfra­gen „sprechend” zu gestal­ten, gebe ich dieser Query den Namen qry_Monate. Der Prä­fix „qry_” ist zwar nicht erforder­lich, dient aber aus mein­er Sicht der besseren Unter­schei­d­barkeit zum Spal­tenna­men.

▲ nach oben …

Ein kleiner Schönheitsfehler …

Bleiben Sie in dieser Abfrage qry_Monate. Home | Kom­binieren | Abfra­gen zusam­men­führen und wählen Sie als zweite Abfrage Pro­jek­te (monatliche Liste). Selb­stre­dend wer­den die bei­den Spal­ten mit den Monat­sna­men verknüpft. Nur noch ein klein­er Kon­troll-Blick:

In der ersten (oberen) Abfrage ist Okto­ber der erste Monat

Diese Ein­stel­lun­gen sind kor­rekt. Ein­schließlich des Join-Art: Link­er äußer­er Join (alle aus erster, übere­in­stim­mende aus zweit­er. OK und die zweite, neu gener­ierte Spalte durch Klick auf den Dop­pelpfeil in der Über­schrift erweit­ern. Da die Spalte MMMM JJJJ mit Monate iden­tisch ist, ent­fer­nen Sie das Häkchen bei MMMM JJJJ und erforder­lichen­falls auch jenes bei Ursprünglichen Spal­tenna­men als Prä­fix ver­wen­den.

Das sieht doch ganz pass­abel aus, oder?

Ist das Ergeb­nis wirk­lich in Ord­nung? Wo ist der Okto­ber 2019? Okay, wenn Sie probe­weise die Spalte Monate nach Okto­ber fil­tern wer­den Sie erken­nen, dass es diese Zeile doch noch gibt. Wenn auch an uner­warteter Stelle. Ungeachtet dieser kleinen Ungereimtheit erstellen Sie doch ein­fach auch hier eine Kreuzta­belle aus den vorhan­de­nen Dat­en. Markieren Sie also die Spalte Monate, Wech­sel zum Menü Trans­formieren und wählen Sie dort Piv­otieren. Als Wertes­palte wer­den sie natür­lich wieder Anzahl wählen. Und es wird Sie nicht über­raschen, dass der Okto­ber 2019 auch hier an falsch­er Stelle ste­ht. Soweit der Schön­heits­fehler.

▲ nach oben …

Ursache und Korrektur

Die Ursache für dieses uner­wartete Phänomen ist auch mir nicht vol­lkom­men eingängig. Und die Sys­tem­atik habe ich auch noch nicht ver­standen. Es ist offen­sichtlich, dass Pow­er Query diesen Daten­satz an den Beginn der Gruppe von Daten­sätzen ver­schoben bzw. sortiert hat, die (auch) keine Dat­en in der verknüpfen Pro­jek­te-Abfrage enthal­ten haben. Wür­den in den Quell­dat­en der Ursprungsta­belle (Excel) auch Lück­en in der Rei­hen­folge existieren, wären diese auch in den unteren Bere­ich der Abfrage qry_Monate ver­schoben wor­den.

Die ein­fach­ste und offen­sichtlich­ste Möglichkeit wäre natür­lich, die fehler­haft ange­ord­nete Spalte(n) ein­fach von Hand an die kor­rek­te Posi­tion zu ver­schieben. Aber das kann ja nicht der Sinn der Sache sein, denn eine der großen Stärken von Pow­er Query ist ja, dass verän­derte Quell­dat­en automa­tisch erkan­nt und kor­rekt aus­gew­ertet (sprich for­matiert) wer­den. Dieser Weg wäre also nur für eine ein­ma­lige Aktion denkbar.

Natür­lich gibt es einen Ausweg, der zwar recht ungewöhn­lich scheint aber doch aus­ge­sprochen effek­tiv wirkt. Sie befind­en sich immer noch in der Abfrage qry_Monate. Markieren Sie im recht­en Seit­en­fen­ster die Zeile Ent­fer­nte Spal­ten oder falls Sie der Spalte einen anderen Namen gegeben haben die Zeile Umbe­nan­nte Spal­ten direkt darunter. Spalte hinzufü­gen, Indexs­palte und bestäti­gen Sie, dass Sie einen Schritt ein­fü­gen wollen. Markieren Sie anschließend bei Angewen­dete Schritte die Zeile Erweit­erte Pro­jek­te (monatliche Liste) und über­prüfen Sie, ob sich etwas in der Rei­hen­folge geän­dert hat.

Nein, der Okto­ber 2019 ist immer noch nicht an erster Stelle. Und die Rei­hen­folge der Spalte Index scheint auch in Ord­nung zu sein. Oder doch nicht? Natür­lich nicht, denn da sie ja nur auf die Schalt­fläche Indexs­palte gek­lickt haben, ohne sie zu erweit­ern und ohne eine Änderung vorzunehmen, begin­nt die Indexs­palte von Haus aus mit 0. Sortieren Sie die Spalte Index auf­steigend und siehe da, die Abfrage begin­nt mit dem Monat Okto­ber 2019. 😀 Löschen Sie nun die Spalte Index, sie hat ihren Dienst getan. Und wenn Sie nun im recht­en Seit­en­fen­ster zum let­zten aufgeze­ich­neten Schritt wech­seln wer­den Sie erken­nen, dass auch die Kreuzta­belle in der gewün­scht­en Rei­hen­folge existiert. Mit ein­er kleinen auch für mich derzeit nicht so ganz nachvol­lziehbaren Aus­nahme: Der erste Daten­satz ist leer; kom­plett leer. Home, Zeilen ver­ringern | Zeilen ent­fer­nen | Leere Zeilen ent­fer­nen und auch dieses Prob­lem ist dauer­haft beseit­igt.

▲ nach oben …

Hat Ihnen der Beitrag gefallen?
Erleichtert dieser Beitrag Ihre Arbeit?

Dann würde ich mich über einen Beitrag Ihrer­seits z.B. 5,00  freuen …
(Und wenn Sie mir Ihre E‑Mail mit­teilen, sende ich Ihnen dann auch die kom­plette erar­beit­ete Muster-Datei)

Dieser Beitrag wurde unter Allgemein, Verschiedenes, Daten zusammenführen, Datentyp anpassen, Datum & Zeit, Excel-Funktionen, Filtern & Sortieren, Foren-Q&A, Join-Art, Power Query, PQ-Formeln (Sprache M), Spalten bearbeiten, {Liste} abgelegt und mit , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.