Suchen...
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Was nicht passt, wird passend gemacht (oder: Wie man mit wenig Aufwand LastNonEmpty doch verwenden kann)

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.

2011-8-12_crew_Abb1

Wir unterscheiden beim Wertevortrag zwei Szenarien.

  1. Vortrag des letzten Wertes auf die letzte Berichtsperiode
  2. 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

2011-8-12_crew_Abb2

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

2011-8-12_crew_Abb3

Letzte Periodenwerte über alle Dimensionen

Anschließend werden die Werte der letzten gefüllten Tage über alle Dimensionskombinationen ermittelt:

2011-8-12_crew_Abb4

2011-8-12_crew_Abb5

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.

2011-8-12_crew_Abb6

2011-8-12_crew_Abb7

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.