Pimp my SQL

“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: , , ,

Kommentieren