Time Intelligence in SSAS Tabular Modellen
Analysis Services bietet im Multidimensionalen Modell mit Calculations und MDX charmante Möglichkeiten Zeit- bzw. Periodenvergleiche zu realisieren. Die notwendige Dynamik wird durch die Architektur und Sprachkonstrukte wie SCOPE, THIS und ORDINAL sichergestellt. Wie lässt sich nun dieses flexible Konzept auf ein Tabular Modell übertragen?
Grundsätzlich steht als DDL DAX zur Verfügung, allerdings ist man limitiert durch die Architektur und die Sprachkonstrukte. Der Periodenvergleich fordert verschiedene Flexibilitäten:
- dynamische Bestimmung des Measures
- dynamische Bestimmung des Zeitraums
- daraus resultierend dynamische Bestimmung der Ebene in der Zeithierarchie
Die Dynamisierung des Measures kann durch Hinzufügen einer weiteren Tabelle und einer kleinen Berechnungformel erledigt werden. Nehmen wir an das die Measures "Revenue" und "Quantity" zur Verfügung stehen, dann sieht die Tabelle folgendermaßen aus:
DynMeasure
Revenue
Quantity
die zugehörige Funktion wie folgt:
CP:=IF(COUNTROWS( VALUES(DynMeasure[DynMeasure]))=1;
SWITCH(Values(DynMeasure[DynMeasure])
;"Revenue";[Revenue Sum]
;"Quantity";[Quantity]
))
Wählt man nun anstatt "Revenue" oder/und "Quantity" als direktes Measure "CP" und fügt die Dimension DynMeasure dem Pivot hinzu, lässt sich über einen Filter auf DynMeasure bestimmen welche Measures angezeigt werden. Das Verhalten ist somit ähnlich einer Implementierung in der nur das Measure "Value/Wert" existiert.
Um die Zeitintelligenz hinzuzufügen kann auf einige implementierte Funktionen zurückgegriffen werden. Jedoch fehlt die Möglichkeit zur Bestimmung der Ebene in einer Dimension. Als Hilfskonstrukt kann für die Zeit folgende Funktion dienen:
MD:=ROUNDDOWN( COUNTROWS( DATESBETWEEN('Date'[Date]; FIRSTDATE('Date'[Date]); LASTDATE('Date'[Date])))/30;0)
Die einzelnen Periodenberechnungen können direkt im Summationsbereich der Tabelle hinterlegt werden:
PY:=[CP](SAMEPERIODLASTYEAR('Date'[Date]))
PQ:=[CP](PREVIOUSQUARTER('Date'[Date]))
PM:=[CP](PREVIOUSMONTH('Date'[Date]))
PD:=[CP](PREVIOUSDAY('Date'[Date]))
Da ich in der Regel unterjährig auswerte, bevorzuge ich SAMEPERIODLASTYEAR anstatt PREVIOUSYEAR, da somit der selbe Zeitraum im Vorjahr gewählt wird, anstatt das gesamte Jahr. Die Berechnungen ziehen schon dynamisch das jeweils von mir gewählte Measure an. Alternativ kann auch mit Parallelperiod gearbeitet werden, jedoch gibt es dort keine Entsprechung zu PreviousDay.
Um diese Berechnungen nun auch dynamisieren kann folgende Formel verwendet werden:
PP:=SWITCH([MD];12;[PY];3;[PQ];1;[PM];0;[PD])
Zur Auswertung im Pivot werden das Measure "CP" und "PP" hinzugefügt, mit einem Slicer kann einfach das Ein- bzw. Ausblenden von Measures realisiert werden.
Eine Verwendung von switch bzw. if Statements sollte in jedem Fall einer Performanceüberprüfung unterzogen werden, so das ggf. der Komfort der Dynamisierung angepasst werden muss.