Set Analysis - Warum geht meine Day to Day Comparison nicht?

Einer der wiederkehrenden Fragen bei Set Analysis - neben der allgemeinen Syntax - ist ein Thema, bei dem unsere Kunden gerne die Dimension des Charts in Set Analysis überschreiben wollen. Ein typischer Fall ist die Day to Day Comparison der Umsätze zwischen zwei Jahren.

Für das  folgendes Beispiel haben wir zwei vollkommen valide Set Analysis Expressions definiert:

//Aktuelles Monat
sum({<Bestelldatum={">=01.07.2017<01.08.2017"}>} Anzahl*Einzelpreis)

//Gleiches Monat Vorjahr
sum({<Bestelldatum={">=01.07.2016<01.08.2016"}>} Anzahl*Einzelpreis)


Die Expressions funktionieren wunderbar für alle möglichen Dimensionen: Produkte, Länder, Kunden. Benutzt man aber ein Kalenderfeld als Dimension des Charts, sind die Leute meist enttäuscht! Qlik packt die Ergebnisse pro Jahr in getrennte Zeilen wenn man etwa das Bestelldatum selbst als Dimension wählt.

Vorjahres Vergleich funktioniert hier nur in der Gesamtsumme

Ja, warum denn? Wie kann ich jetzt den 31.07.2016 mit dem vom 31.07.2017 vergleichen?

Die Erklärung findet sich in dem Weg wie Set Analysis von der QIX Engine abgearbeitet wird: Bevor das Chart zum Rechnen anfängt, werden für jedes SET die relevanten Zeilen aus dem Datenmodell "markiert". Diese Zeilen werden dann dem jeweiligen Dimensionswert zugeordnet, und dann dort aggregiert (in unserem Fall summiert). Im Screenshot oberhalb werden also die relevanten Faktenzeilen

  • für die erste Expression auf die Dimensionsausprägungen 01.07.2017 bis 31.07.2017, 
  • für die zweite Expression auf die Dimensionsausprägungen 01.07.2016 bis 31.07.2016
aufgeteilt. Damit entstehen insgesamt 62 Zeilen.

Die SET Analysis wird nicht für jede Zeile neu interpretiert, sondern einmal global für das Chart gerechnet.  Das ist auch der Grund warum ich nicht am 31.07.2017  eine Set Analysis <Datum={Datum-1}> stehen haben kann um auf den Vortag zuzugreifen.  Da funktioniert tatsächlich manchmal ein IF-Statement mit Total-Qualifier besser, weil das If-Statement für jede Zeile des Datenmodells geprüft wird.

Können wir also unsere beiden Expressions nutzen, um eine Day to Day Comparison zu machen? JA, man benötigt aber ein Feld im Datenmodell, welches für beide Jahre den gleichen Wert liefert.

    
dual(
            num(day(Bestelldatum),'00')&'.'&num(month(Bestelldatum),'00'), 
           (month(Bestelldatum)*10000)+day(Bestelldatum)
) as TagMonat


Das Feld entledigt sich des Jahres, und hat intern für 31.7.2016 und den 31.07.2017 den numerischen Wert   70031. Man könnte wohl auch die daynumberofyear() Funktion nutzen, aber irgendwie vertraue ich da dem Schaltjahr trotz Dokumentation nicht.

Was passiert also jetzt im Chart wenn wir dieses Feld als Dimension nutzen? Die Set Expressions liefert den gleichen Dimensionswert für beide Jahre. Damit ist es für Qlik eine gemeinsame Zeile, mit der man dann mittels column(1)-column(2) die Day to Day Comparison machen kann.


Das neue Feld "Tag Monat" läßt den Vergleich zu

Auch in Line-Charts sieht man den Unterschied gut. Links das normale Bestelldatum: hier sind die Linien nacheinander, weil ja ein Jahr vergangen ist (noch klarer mit einem kontinuierlichen Linechart). Mit dem Tag Monat Feld haben wir die Linien übereinander.


Auf Tagesebene ist das meist nur die halbe Wahrheit, weil Handelsunternehmen meist den ersten Verkaufstag im Jahr mit dem ersten Verkaufstag des Vorjahres vergleichen wollen. In dem Fall wird man überhaupt ein eigenes Feld im Datenmodell benötigen.


Beispiel zum Downloaden gibt es hier.




PS: wer rasch auf QlikView November 2017 oder QlikSense Sept 2017 möchte, bitte folgenden Artikel nicht übersehen. Die Syntax für Set Analysis mit Single/Doublequotes wird in diesem Releases nachgeschärft! https://community.qlik.com/blogs/qlikviewdesignblog/2017/09/11/quotes-in-set-analysis




heldendaten GmbH,2017