CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Preise mit Gültigkeitsdatum

Preise werden häufig zur Berechnung anderer Kennzahlen wie zum Beispiel dem Umsatz (Preis * Menge) verwendet. Dabei werden die Preise oft in einer separaten Tabelle abgelegt, in der neben dem Preis und dem Artikelbezug auch das Datum, ab dem der Preis gültig ist, gespeichert wird. Ändert sich ein Preis, wird ein neuer Datensatz mit einem neuen Startdatum in die Tabelle geschrieben. Um bei einer Abfrage des Preises für eine beliebige Periode den korrekten Preis aus der Tabelle geliefert zu bekommen, kann nicht einfach auf das gewünschte Datum gefiltert werden, da in der Preistabelle keine „echte“ Periodeninformation vorhanden ist. Welche Schritte notwendig sind, um dennoch den richtigen Preis zu finden, soll der folgende Blogbeitrag zeigen.

Im Folgenden wird eine Vorgehensweise zur Bestimmung des Artikelpreises in einer beliebigen Periode dargestellt.

Szenario

Der Ausgangspunkt ist eine Tabelle, die alle Preisänderungen der Produkte enthält. Ein Preis ist ab dem angegebenen Datum so lange gültig, bis ein neuerer Datensatz in der Tabelle existiert.

Abbildung 1: Preisänderungen des Produkts P1 (Arcade AE 44)

Berechnung

Aus dem oben dargestellten Beispiel (siehe Abbildung 1) können die Preise für Januar 2014, März 2014, Juni 2014 und Juni 2015 direkt abgefragt werden. Es wird aber komplizierter, wenn man den Preis für Dezember 2015 oder den aktuellen Preis abfragen möchte.

Für die Bestimmung der Preise in fehlenden Monaten wird folgende Vorgehensweise verwendet:

  1. Im ersten Schritt werden alle Preiseinträge eines Produkts mit Berücksichtigung des Datums nummeriert:

Abbildung 2: Nummerierung der Preiseinträge pro Produkt

2. Als nächstes wird das Ergebnis des ersten Schritts (siehe Abbildung 2) mit sich selbst gejoint. Damit wird in jeder Zeile das Datum des nachfolgenden Eintrags zurückgegeben. Dieses Datum kann als Gültigkeits-Enddatum interpretiert werden. Für Einträge ohne Nachfolger kann das heutige Datum bzw. der heutige Monat festgelegt werden.

Abbildung 3: Gültigkeits-Enddatum aus nachfolgendem Preiseintrag

3. Für die meisten Berechnungen reichen das Anfangs- und Enddatum des Gültigkeitsraums. Sollen aber die Preise für alle Monate ermittelt werden, muss das Ergebnis des zweiten Schritts (siehe Abbildung 3) mit den im Modell vorhandenen Monaten kombiniert werden. Dies wird mithilfe der durch den DeltaMaster Modeler vorgefertigten View V_DIM_01_03_Monat Die Erstellung der View kann in der Analysesitzung des Modelers im Bericht Levels aktiviert werden.

Abbildung 4: Aktivierung der View V_DIM_01_03_Monat

4. Der komplette Ausdruck sieht dann folgendermaßen aus:

CREATE VIEW V_Import_FACT_Preis
AS


WITH Preis
AS (
    SELECT
            ROW_NUMBER() OVER (PARTITION BY p.ProduktID ORDER BY p.MonatID) RowNumber,
            p.MonatID,
            p.ProduktID,
            p.Preis
    FROM T_D_Preis p                               
)


SELECT
    m.MonatID,
    pVon.ProduktID,
    pVon.Preis

FROM Preis pVon

    LEFT JOIN Preis pBis
            ON  pVon.ProduktID = pBis.ProduktID
            AND pVon.RowNumber = pBis.RowNumber - 1

    LEFT JOIN V_DIM_01_03_Monat m
            ON  m.MonatID >= pVon.MonatID
            AND m.MonatID < ISNULL(

pBis.MonatID,      
YEAR(DATEADD(m,1,GETDATE())) * 100 +
MONTH(DATEADD(m,1,GETDATE()))
)  

Abbildung :5 SQL View

5. Schließlich können die Preise eines Artikels vom Erstellungsdatum bis heute dargestellt werden.

Abbildung 6: Preise der Produkt P1 (Arcade AE 44)

Ergebnis in DeltaMaster

Die Preisentwicklung des Produkts P1 (Arcade AE 44) kann in DeltaMaster wie folgt darstellt werden:

Abbildung 7: Preisentwicklung der Produkt P1 (Arcade AE 44)