|
Application Express-Berichte als Kreuztabelle darstellen ...
mit Oracle11g Update!
Insbesondere in Geschäftsberichten wird häufig die
Darstellung als Kreuztabelle
gewünscht.
Abb.1: Bericht als Kreuztabelle darstellen
Abbildung 1 zeigt den Unterschied zwischen einem normalen
Application Express-Bericht und der Darstellung als Kreuztabelle. In
der Kreuztabelle werden die Daten im Grunde genommen "gekippt". Die
Umsätze pro Tag, die in einem normalen Bericht durch Zeilen
repräsentiert werden, werden nun durch Spalten
repräsentiert. Die Herausforderung besteht darin, dass die
eigentlichen Tabellendaten fast immer in "normaler" Form (also dem linken Bericht
entsprechend) vorliegen (Abbildung 2).
Abb.2: Betrachten der Tabellendaten im SQL Workshop
Vorbereitungen
Legen Sie sich eine Tabelle an und füllen Sie diese mit einigen Testdatensätzen. Natürlich
können Sie diesen Tipp auch direkt mit eigenen Daten nachvollziehen.
Erstellen Sie nun eine Application Express-Anwendung. Auf die erste Seite legen
Sie zwei Felder zur Datumsauswahl (P1_START_DATUM
und P1_END_DATUM)
und einen Bericht auf die neue Tabelle. Als SQL hinterlegen
Sie ...
Das Ergebnis sollte wie in Abbildung 3 aussehen.
Abb.3: 1. Schritt: Erstellen eines einfachen Berichts
Nun wurde nicht für jedes
Produkt an jedem
Tag Umsatz erzielt. Um am Ende zur Kreuztabelle zu kommen,
benötigen wir als Zwischenschritt auch die Kombinationen
zwischen Produkt und Datum, für die es keinen Umsatz gibt.
Hier hilft der Partitioned
Outer Join weiter. Partitioned
Outer Joins haben nichts mit der Partitioning-Option der Datenbank zu
tun - sie sind ein Teil des normalen SQL Sprachumfangs.
Weitere Informationen zu diesem Thema finden Sie in der
Oracle-Dokumentation (Data Warehousing Guide).
Um den Partitioned Outer Join durchführen zu
können, benötigen wir noch eine Tabelle mit einer
Zeile für jedes Datum. Das nachfolgende Skript legt eine
solche an und füllt sie mit je einer Zeile für jedes
Datum im Jahr 2006. Führen Sie die Kommandos im SQL Workshop
aus.
Ändern Sie nun Ihren Bericht. Er soll nun zusätzlich zu den
Umsätzen Zeilen für die Tage ohne Umsätze
erhalten.
In dem SQL-Kommando erkennen Sie zunächst einen normalen
Right Outer Join. Die
Klausel PARTITION BY (PRODUCT)
bewirkt, dass diese Operation für jedes Produkt vorgenommen
wird. Abbildung 4 zeigt das Ergebnis.
Abb.4: 2. Schritt: "Partitioned Outer Join"
Einen Partitioned Outer Join benötigen Sie übrigens nicht
nur zur Erstellung einer Kreuztabelle. Auch wenn Sie ein Diagramm
erstellen möchten, ist diese Technik hilfreich;
schließlich benötigen Sie auch hier Platzhalter
für die Tage ohne Umsatz. Wenn Sie,
wie vor einiger Zeit auf
dieser Seite dargestellt, gleitende Durchschnitte berechnen
möchten, sind Partitioned Outer Joins ebenfalls sehr wichtig.
Nun sind die Daten vorbereitet - Es fehlt "nur" noch das eigentliche
"Kippen" der (Pivoting) der Tabelle.
Und dies stellen wir im folgenden
zweimal vor: Die Nutzer von Oracle11g können die Kreuztabelle auf einfachstem
Wege mit der neuen SQL PIVOT-Klausel erzeugen;
für die Nutzer von Oracle9i und
Oracle10g stellen wir anschließend eine PL/SQL-Prozedur vor.
Kreuztabellen in Oracle11g
Oracle11g unterstützt Kreuztabellen
out-of-the-box als Teil der
SQL-Abfragesprache. Mit der neuen PIVOT-Klausel
wird definiert, welche
"neuen" Spalten in der Ergebnismenge mit welchen Daten erzeugt werden
sollen. So wird in der nachfolgenden SQL-Abfrage festgelegt, dass die
Umsatzdaten des Datums P1_START_DATE in
der neuen Spalte TAG_1, die
des Datums P1_START_DATE + 1
(also plus 1 Tag) in der neuen Spalte TAG_2 und
fortfolgend dargestellt werden sollen. Wieviele Spalten dargestellt
werden sollen, ist in der SQL-Abfrage wiederum festgelegt
(hier: fünf).
Wenn Sie also auf einer Oracle11g-Datenbank arbeiten, können Sie
einfach einen neuen SQL-Bericht mit nachfolgender Abfrage erstellen und
direkt bei den Spaltenüberschriften
weitermachen.
Kreuztabellen vor Oracle11g
Wenn Sie auf einer Oracle9i oder Oracle10g-Datenbank arbeiten, steht
Ihnen die PIVOT-Klausel nicht zur Verfügung. Doch das ist nicht weiter tragisch:
Mit ein wenig PL/SQL-Code können Sie genau das gleiche erreichen.
Erzeugen Sie
zunächst (entweder im SQL Workshop oder
mit SQL*Plus) die folgende PL/SQL-Funktion
GETPIVOTSQL - sie wird die Aufgabe übernehmen,
die richtige SQL-Abfrage für die gewünschte
Kreuztabelle zu generieren.
Sie nutzen die Funktion wie folgt:
Wagen Sie einen ersten Test im SQL Workshop
(kodieren Sie hierfür das Startdatum hart auf
den 23.01.2006):
Das Ergebnis ist eine SQL-Abfrage, die zwar nicht so gut lesbar ist, die aber
funktioniert:
Wenn Sie die generierte Abfrage im SQL Workshop
(oder in SQL*Plus) ausführen, werden
Sie schon das gewünschte Ergebnis sehen. Nun geht es daran, die Kreuztabelle als
Bericht auf die Anwendungsseite zu bringen. Erzeugen Sie einen neuen
SQL Bericht
und hinterlegen Sie den Aufruf von GETPIVOTSQL als SQL Abfrage:
Das Schöne ist, dass APEX in der Berichtsdefinition auch eine PL/SQL-Funktion,
die ein SQL zurückliefert, entgegennimmt - und die Funktion
GETPIVOTSQL ist
eine eben solche. Insofern setzen wir den Aufruf einfach hier ein.
Spaltenüberschriften einstellen
Sie sind fast fertig ... im Moment sieht das Ergebnis so aus:
Abb.5: Anwendungsseite mit den fast fertigen Kreuztabellen
Allerdings sind die Spaltenüberschriften TAG1
bis TAG5 bzw.
VALUE[1] bis VALUE[5] noch
nicht besonders aussagekräftig. Aber auch dies ist kein Problem, denn das
"Beginn-Datum der Kreuztabelle ist durch das Element P1_START_DATUM variabel. Damit können
auch die Spaltenüberschriften variabel gestaltet werden (Abbildung 5).
Abb.6: Spaltenüberschriften mit PL/SQL setzen
Klicken Sie in den Berichtsattributen beim Überschriftstyp
PL/SQL an und hinterlegen Sie folgenden PL/SQL Block.
Der PL/SQL Block muss die Überschriften durch Doppelpunkte
getrennt zurückgeben. Die erste Spaltenüberschrift
soll Produkt sein, die folgenden Spalten
sollen das hochgezählte Datum erhalten - beginnend mit dem
:P1_START_DATUM. Speichern
Sie den PL/SQL-Block ab und starten Sie die Seite neu ...
Abb.7: Das Endergebnis: Die Kreuztabelle mit den "richtigen" Spaltenüberschriften
Damit ist die Kreuztabelle fertig. "Spielen" Sie ein wenig damit, indem Sie
das :P1_START_DATUM ändern.
Die Erstellung einer Schaltfläche zum Bewegen um eine Woche nach vorne
oder zurück ist nun ein Leichtes (:P1_START_DATE - 7
bzw. :P1_START_DATE + 7).
Das Element :P1_END_DATUM können
Sie löschen - es wird nicht mehr benötigt.
Zurück zur Community-Seite
|