Mit Power Query eine dynamische Datums-/Zeitdimension (DimDate) erzeugen

Auf einem meiner Streifzüge durchs Technet-Forum bin ich über eine Frage gestolpert, bei der eine Datums-/Zeitdimension benötigt wird, die 2-Minuten-Intervalle erzeugt. Da musste ich nun endlich mal ausprobieren, was ich schon lange vor mir her geschoben hatte: Eine dynamische Zeitdimension mit PowerQuery erzeugen, die vom Nutzer in Excel mit den Parametern gefüllt werden kann, ohne dass er den Abfrage-Entwurf ändern muss.

Auf diesem Blatt trägt man die gewünschten Parameter ein:

und aktualisiert dann nur rechts die entsprechende Abfrage (ganz rechts: Dokument-Kreispfeil-Symbol).

In den Blättern „DimDate“ und „DimDateTime“ werden daraufhin die Werte entsprechend aktualisiert. Übrigens habe ich mich diesbezüglich hier inspirieren lassen. Interessant dabei ist das Verwenden der List.Dates-Funktion. Wenn man sie standardmäßig aufruft, erscheint folgender Dialog:

Aus diesen Parametern erstellt diese Funktion nun eine Tabelle mit einer Datumsspalte. Da wir dies aber dynamisch halten wollen und aus dem Excel-Blatt übergeben wollen, nutzen wir zusätzlich noch diese Technik. Hier werden die einzelnen Parameterwerte aus der Tabelle ausgelesen und der Power Query Abfrage übergeben.

So sieht der Code aus:

let

Parameter = Excel.CurrentWorkbook(){[Name="Parameter"]}[Content],

StartDate= Parameter{0}[Value],

Duration= Parameter{6}[Value],

StepsDays= Parameter{2}[Value],

StepsHours= Parameter{3}[Value],

StepsMinutes= Parameter{4}[Value],

StepsSeconds= Parameter{5}[Value],

Source = List.DateTimes,

InvokedFunction = Source(StartDate, Duration, duration(StepsDays, StepsHours, StepsMinutes, StepsSeconds)),

TableFromList = Table.FromList(InvokedFunction, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

AddIndex = Table.AddIndexColumn(TableFromList, "Index", 1, 1),

RenameCols = Table.RenameColumns(AddIndex,{{"Column1", "DateTime"}}),

ChangeDatetime = Table.TransformColumnTypes(RenameCols,{{"DateTime", type datetime}}),

AddDate = Table.AddColumn(ChangeDatetime, "Date", each [DateTime]),

ChangeDate = Table.TransformColumnTypes(AddDate,{{"Date", type date}}),

AddYear = Table.AddColumn(ChangeDate, "Year", each Date.Year([Date])),

AddMonthNo = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date])),

AddMonthName = Table.AddColumn(AddMonthNo, "Month Name", each Date.ToText([Date],"MMM")),

AddDayNo = Table.AddColumn(AddMonthName, "Day", each Date.Day([Date])),

AddDay = Table.AddColumn(AddDayNo, "Day Name", each Date.ToText([Date],"ddd")),

AddQuarter = Table.AddColumn(AddDay, "Quarter Number", each Date.QuarterOfYear([Date])),

AddShortYear = Table.AddColumn(AddQuarter, "ShortYear", each Text.End(Text.From([Year]),2)),

ChangeFormat = Table.TransformColumnTypes(AddShortYear,{{"ShortYear", Int64.Type}}),

AddHour = Table.AddColumn(ChangeFormat, "Hour", each Time.Hour([DateTime])),

AddMinute = Table.AddColumn(AddHour, "Minute", each Time.Minute([DateTime])),

AddSecond = Table.AddColumn(AddMinute, "Second", each Time.Second([DateTime])),

AddTime = Table.AddColumn(AddSecond, "Time", each Time.From([DateTime])),

ChangeTimeFormat = Table.TransformColumnTypes(AddTime,{{"Time", type time}})

in

ChangeTimeFormat

Außerdem gibt es dort noch eine einfache Variante, die fest auf 1-Tagesintervalle eingestellt ist.

Diese sollte man verwenden, wenn man mit Zeitintelligenzfunktionen arbeiten möchte:

let

Parameter = Excel.CurrentWorkbook(){[Name="ParameterDate"]}[Content],

StartDate= Parameter{0}[Value],

Duration= Parameter{2}[Value],

Source = List.Dates,

InvokedFunction = Source(DateTime.Date(StartDate), Duration, duration(1,0,0,0)),

TableFromList = Table.FromList(InvokedFunction, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

AddIndex = Table.AddIndexColumn(TableFromList, "Index", 1, 1),

RenameCols = Table.RenameColumns(AddIndex,{{"Column1", "Date"}}),

ChangeDate = Table.TransformColumnTypes(RenameCols,{{"Date", type date}}),

AddYear = Table.AddColumn(ChangeDate, "Year", each Date.Year([Date])),

AddMonthNo = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date])),

AddMonthName = Table.AddColumn(AddMonthNo, "Month Name", each Date.ToText([Date],"MMM")),

AddDayNo = Table.AddColumn(AddMonthName, "Day", each Date.Day([Date])),

AddDay = Table.AddColumn(AddDayNo, "Day Name", each Date.ToText([Date],"ddd")),

AddQuarter = Table.AddColumn(AddDay, "Quarter Number", each Date.QuarterOfYear([Date])),

AddShortYear = Table.AddColumn(AddQuarter, "ShortYear", each Text.End(Text.From([Year]),2)),

ChangeFormat = Table.TransformColumnTypes(AddShortYear,{{"ShortYear", Int64.Type}})

in

ChangeFormat

Viel Spaß damit und stay querious! :-)


Weitere Tutorials?

Natürlich haben wir noch mehr wertvolle Tipps rund um Microsoft BI für Sie!