Zeitliche Intervalle filtern in dimensionalen Abfragen

Hallo zusammen,

heute wollen wir in einem Report ein zeitliches Intervall filtern anhand von zwei Parametern, die der User auf der Eingabeaufforderungsseite füllt. Wenn man einen Bericht dimensional entwickelt (egal ob auf DMR oder OLAP) erzeugt man sog. MemberSets, die dann ausgewertet werden. Man erstellt zum Beispiel ein MemberSet für das aktuelle Jahr und kann dann beispielsweise den Umsatz für dieses MemberSet berechnen lassen. Das geht so: total([Umsatz] within set [<MemberSet>]

Das Problem dabei ist, dass man diese Elemente explizit definieren muss. Wenn man z.B. den Februar bis November eines Jahres entsprechend auswerten möchte, dann müssen alle Monate explizit angegeben werden. Das ist im Falle einer Zeit-Dimension unüblich und unpraktisch. Man möchte sicherliche eher nur den Anfangs- und Ende-Monat angeben. Die dazwischenliegenden Monate sollen automatisch mitselektiert werden.

Um dieses zu erreichen kann man nicht den BETWEEN-Operator verwenden (wie bei relationaler Abfrageerstellung), sondern muss sich eine entsprechendes MemberSet mit Hilfe verschiedener Funktionen zusammen bauen. Dazu benötigen wir folgende Funktionen:

  • Lastperiods(<Anzahl Perioden>, <Letztes Element>)
  • Operator  ->
  • Intersect (<Set1>, <Set2>)

Mit lastperiods können wir ein Set definieren, dass mit <Letztes Element> endet und die <Anzahl Perioden> Member davor beinhaltet. Mit lastperiods(12, [Dez. 2013]) würden wir z.B. alle Monate des Jahres 2013 erhalten. Mit dem Operator -> kann ein spezifischer Member rausgepickt werden. Man kann den Operator auch mit Parametern kombinieren, z.B. [Dimensional].[Datum (Monat)]. .[Datum (Monat)].[Monat]->?p_MonatVon?. Man kann beides auch kombinieren, um z.B. 3 Monate vor dem gewählten Monat zu bekommen. Wenn man für <Anzahl Perioden> einen negativen Wert angibt, arbeitet die Funktion vorwärts, liefert also die n folgenden Perioden.

Um unser Intervall definieren zu können, benötigen wir noch eine dritte Funktion: intersect. Hiermit erhält man die Schnittmenge zweier Sets zurück. Z.B.: Set1=(1,2,3) und Set2=(3,4,5). Dann erhält man mit intersect die Menge (3), weil nur dieses Element in beiden Sets vorhanden ist.

Nun können wir hingehen und folgende Sets bauen und danach mit intersect die Schnittmenge bilden:

  • Set1 = lastperiods (-120; [Dimensional].[…..].[Monat]->?p_MonatVon?)
  • Set2 = lastperiods (120; [Dimensional].[…..].[Monat]->?p_MonatBis?)

Man kann sich das Ganze auf dem Zeitstrahl veranschaulichen:

Zeitstrahl intersect

Auf das Ergebnisset, das man sich mit obigen Funktionen erstellt hat, kann man dann entsprechende Rechenoperationen durchführen.

If you are interested in this or other advanced Cognos/SQL topics you can also attend training on my corporate homepage. At the moment my open courses are only available in German. Inhouse training and online courses are also available in English language. So check out my open trainings (German) or my online courses (English)!

Share and Enjoy: Diese Icons verlinken auf Bookmark Dienste bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • LinkedIn
  • XING
  • Facebook
  • Google Bookmarks
  • Twitter

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *