Im Blogbeitrag Die LastNonEmpty-Aggregation haben wir uns bereits mit den Vorzügen aber auch mit den gravierenden Nachteilen der LastNonEmpty-Aggregation beschäftigt. Heute wollen wir den dort genannten Lösungsansatz Wertevortrag betrachten. Es werden auf die jeweils letzte gefüllte Periode Werte vorgetragen, um LastNonEmpty zu einer richtigen Aggregation zu bewegen.
LastNonEmpty übernimmt auf jeder Ebene den letzten nicht-leeren Wert. Somit können sich bei tagesgenauer Betrachtung auf Monats-, Quartals- und auch Jahresebene unter Umständen falsche Produktsummen ergeben (vgl. Bild), die durch einen Wertevortrag berichtigt werden.
Wir unterscheiden beim Wertevortrag zwei Szenarien.
- Vortrag des letzten Wertes auf die letzte Berichtsperiode
- Auffüllen der belegten Werte mit 0 auf die letzte Berichtsperiode
Beide Szenarios unterscheiden sich nur durch den eingesetzten Wert (letzter Wert bzw. Wert “0″).
Die zu ermittelnden Elementkombinationen sind aber identisch. Die hier gezeigte Vorgehensweise bedingt nicht, dass immer alle (Tages-)Perioden gefüllt sein müssen. Die letzte nicht leere Periode wird ermittelt und um die fehlenden Werte ergänzt.
In unserem Beispiel verwenden wir die Variante (a), weil sie einen zusätzlichen Komplexitätsgrad enthält (Werte der letzten gefüllten Periode vortragen).
Letzte gefüllte Perioden je Monat
Wir ermitteln zunächst die jeweils letzten belegten Tage, die dann mit Werten aufgefüllt werden sollen:
select JahrMonat, max(Datum) MaxTagMonat from (SELECT [Datum], datepart(yyyy,[Datum])*100+datepart(mm,[Datum]) JahrMonat FROM [LastNonEmpty].[dbo].[T_Import_Bestand] ) tab group by JahrMonat
Letzte gefüllte Periode über alle Dimensionen hinweg
Dann müssen wir die jeweils letzten belegten Tage über alle Dimensionskombinationen finden:
select JahrMonat, Produkt, max(Datum) MaxTagMonatProdukt from (SELECT [Datum], datepart(yyyy,datum)*100+datepart(mm,datum) JahrMonat, [Produkt] FROM [LastNonEmpty].[dbo].[T_Import_Bestand] ) tab1 group by jahrmonat,Produkt
Letzte Periodenwerte über alle Dimensionen
Anschließend werden die Werte der letzten gefüllten Tage über alle Dimensionskombinationen ermittelt:
Füllwerte
Wir haben in unserem täglichen Importprozess bereits alle realen Werte importiert. Unsere Abfrage soll uns also nur noch die Füllwerte liefern. Dazu grenzen wir die bereits vorhandenen Werte aus unserer Ergebnismenge aus.
Wir erhalten die noch fehlenden Werte.
Empfehlungen
Füll-Flag
Sollen Werte <> 0 aufgefüllt werden müssen, so sollte über ein Füll-Flag nachgedacht werden.
In einem realen Datenmodell mit täglichem Datenimport kann es passieren, dass bei der täglichen Datenverarbeitung mehr Füllwerte generiert werden, als tatsächliche Bestandswerte importiert werden. Die gestrigen Füllwerte werden heute aber meist nicht mehr benötigt.
Mit Hilfe einer Löschprozedur, die auf das Füll-Flag abfragt, kann die Datenmenge überschaubar gehalten werden.
Monats-, Quartals- und Jahreswechsel
Die Löschprozedur muss die Wechsel in den verdichteten Periodeneinträgen berücksichtigen, da die Füll-Logik am letzten Tag des Monats (auch für Quartal und Jahr) erhalten bleiben muss.