28. August 2007

Kreuztabellen in Oracle11g: SQL PIVOT-Klausel

Vor einiger Zeit habe ich in diesem Blog einen Tipp zum Thema Kreuztabellen erzeugen veröffentlicht. In Oracle11g gibt es dazu ein neues SQL-Konstrukt: Die PIVOT bzw. UNPIVOT-Klausel. Der alte Tipp bleibt natürlich gültig - schließlich gibt es diese Klauseln in Oracle9i oder Oracle10g noch nicht.
Ein Beispiel: Der folgende Output ist erwünscht:
DEPTNO SUM(CLERK) SUM(SALESMAN) SUM(MANAGER)
---------- ---------- ------------- ------------
    30        950          5600         2850
    20       1900                       2975
    10       1300                       2450
Wie bekommt man das hin? Ganz einfach in zwei Schritten:
  1. Zunächst wird die EMP-Tabelle "gekippt". Die einzelnen Werte der Spalte JOB (SALESMAN,CLERK,MANAGER) sollen neue Spalten der Pivot-Tabelle werden:
    select deptno, clerk, salesman, manager
    from emp pivot (
    sum(sal) for JOB
    in ('CLERK' as "CLERK", 'SALESMAN' as "SALESMAN", 'MANAGER' as "MANAGER")
    )
    
    DEPTNO      CLERK   SALESMAN    MANAGER
    ---------- ---------- ---------- ----------
        10                             2450
        30        950
        30                  1250
        20                             2975
        30                             2850
        10
        20
        20
        20       1100
        30                  1500
        20        800
        30                  1600
        30                  1250
        10       1300
    
  2. Dann nur noch nach DEPTNO summieren:
    select deptno, sum(clerk), sum(salesman), sum(manager)
    from emp pivot (
    sum(sal) for JOB
    in ('CLERK' as "CLERK", 'SALESMAN' as "SALESMAN", 'MANAGER' as "MANAGER")
    )
    group by deptno
    
    DEPTNO SUM(CLERK) SUM(SALESMAN) SUM(MANAGER)
    ---------- ---------- ------------- ------------
        30        950          5600         2850
        20       1900                       2975
        10       1300                       2450
    
    Man sieht also: Kreuztabellen sind in Oracle11g einfach nur ... einfach!

Kommentare:

Patrick Wolf hat gesagt…

Nette Sache, muss ich mir merken und mal näher ansehen!

Danke
Patrick

Walid Chaar hat gesagt…

Bin SQL Einsteiger und kannte das mit den doppelten Anführungszeichen ("Gänsefüßchen") noch nicht, um die neuen Feldnamen zu generieren. Klappt wunderbar bei mir.

Danke Walid

Beliebte Postings