“Form schlägt Inhalt!” ist eine Aussage, der ich mich leider viel zu häufig gegenüber sehe. Das wichtige an einem Report ist die korrekte Schriftart, Linienstärken und die pixelgenaue Ausrichtung der Spalten. Ob eine Zahl hier und dort “ein wenig” falsch ist, das bemerkt in der Regel niemand. Wenn aber die Überschrift nicht zentriert und nicht in Arial 12 ist, dann ist der Bericht wertlos!
Jedoch nicht jede grafische Aufbereitung eines Berichts ist verschwendete Mühe. Seitenlange Zahlenreihen schaut sich niemand an, und selbst wenn, bleibt die Aussagekraft der Zahlen durch die Menge an Informationen verborgen. Ein Mittelweg zwischen Layout/Grafik und Information muss also her. Mein Werkzeug erster Wahl: SQL*Plus.
Als Beispiel benötigen wir eine Auswertung über unsere Kunden und deren Umsatz. Die Auswertung soll zu Kategorisierung in A, B und C Kunden dienlich sein. Die Grunddaten unserer Tabelle schauen wie folgt aus:
SELECT * FROM kunden;
ID UMSATZ --------------- --------------- 1 60 2 45 3 31 4 24 5 80 6 57 7 31 8 3 9 16 10 47
Selbst sortiert gibt uns diese Tabelle nicht wirklich einen Überblick welche Kunden wir nun in welche Kategorie aufnehmen sollten. Wichtig zu wissen wäre zum Beispiel der Anteil eines Kunden an unserem Gesamtumsatz. Hierfür dient die analytische Funktion ratio_to_report.
col anteil heading 'Anteil in %' SELECT id, umsatz, round(ratio_to_report(umsatz) over () * 100) ANTEIL FROM kunden ORDER BY ANTEIL DESC;
ID UMSATZ Anteil in % --------------- --------------- --------------- 5 80 20 1 60 15 6 57 14 10 47 12 2 45 11 7 31 8 3 31 8 4 24 6 9 16 4 8 3 1
Das ist nicht schlecht und bei unseren 10 Beispielkunden recht gut zu überschauen. Aber wie das Sprichwort: “Ein Bild sagt mehr als tausend Worte”, wie wäre es mit einer Balkengrafik um den Umsatz darzustellen? Hierfür verwenden wir die ANTEIL Spalte einfach weiter und erzeugen uns horizontale Balken:
SELECT id,
umsatz,
round(ratio_to_report(umsatz) over () * 100) ANTEIL,
LPAD('*',round(ratio_to_report(umsatz) over () * 100),'*') as Balken
FROM kunden
order by 3 desc;
ID UMSATZ Anteil in % Balken --------------- --------------- --------------- ----------------------- 5 80 20 ******************** 1 60 15 *************** 6 57 14 ************** 10 47 12 ************ 2 45 11 *********** 7 31 8 ******** 3 31 8 ******** 4 24 6 ****** 9 16 4 **** 8 3 1 *
Aber das ganze geht noch etwas eleganter:
col ANTEIL heading "Anteile" noprint
SELECT id,
umsatz,
round(ratio_to_report(umsatz) over () * 100) ANTEIL,
LPAD('*',round(ratio_to_report(umsatz) over () * 100),'*') || ' (' ||
round(ratio_to_report(umsatz) over () * 100) || '%)'
as bar
FROM kunden
order by 3 desc;
ID UMSATZ BAR --------------- --------------- ----------------------------- 5 80 ******************** (20%) 1 60 *************** (15%) 6 57 ************** (14%) 10 47 ************ (12%) 2 45 *********** (11%) 7 31 ******** (8%) 3 31 ******** (8%) 4 24 ****** (6%) 9 16 **** (4%) 8 3 * (1%)
Um unseren Bericht vollständig zu machen fehlt natürlich noch eine Überschrift. Auch der maximale, minimale, durchschnittliche und der Gesamtumsatz wären interessant:
COMPUTE avg sum min max OF umsatz ON report break on report ttitle center Kundenumsatz skip 2 set feed off Kundenumsatz ID UMSATZ BAR ---- --------------- ---------------------------------------- 5 80 ******************** (20%) 1 60 *************** (15%) 6 57 ************** (14%) 10 47 ************ (12%) 2 45 *********** (11%) 7 31 ******** (8%) 3 31 ******** (8%) 4 24 ****** (6%) 9 16 **** (4%) 8 3 * (1%) --------------- avg 39,4 mini 3 maxi 80 sum 394
Schlagworte: Analytische Funktionen, Oracle, SQL, SQL*Plus