2016-08-03 30 views
0

Ich habe eine Tabelle in einer Oracle 11g-Datenbank, die wie folgt aussieht:Oracle-Gruppe durch und Pivot

ownerid | propertyid | name 
-------------------------------------- 
1  | 1000001 | SMITH MARY 
2  | 1000001 | SMITH JOHN 
3  | 1000002 | HUGHES JANE 
4  | 1000003 | CHEN ALICE 
5  | 1000003 | MCCOY ELLIS 

Ich versuche, in der Tabelle auf propertyid und schwenken die Zeilen zu Spalten zu gruppieren, so dass es so aussieht, dies:

propertyid | owner1   | owner2 
--------------------------------------------- 
10001  | SMITH MARY  | SMITH JOHN 
10002  | HUGHES JANE | <null> 
10003  | CHEN ALICE  | MCCOY ELLIS 

Jede Eigenschaft kann zwischen 1 und 3-Besitzer haben, aber ich bin daran interessiert sind nur in den ersten beiden, wie sie erscheinen, wenn sie auf ownerid bestellt.

Meine beste Lösung war, zwei Unterabfragen zu erstellen: einen der "ersten" Besitzer und einen weiteren "zweiten" Besitzer. Ich benutzte die nth_value Funktion wie folgt:

-- first owners 
select 
    propertyid, 
    nth_value(name, 1) over (partition by propertyid order by ownerid) as owner_1 
from owners 

Aber das gibt mir zu duplizieren (obwohl korrekt) Paare von Eigenschaften und Eigentümer, wenn die Gesamtzahl der Besitzer von mehr als 1. Im Allgemeinen ist Ich mag es fühlen muss besser sein Art und Weise dies zu tun. Hat jemand irgendwelche Ideen?

Antwort

2
with 
    inputs (ownerid, propertyid, name) as (
     select 1, 1000001, 'SMITH MARY' from dual union all 
     select 2, 1000001, 'SMITH JOHN' from dual union all 
     select 3, 1000002, 'HUGHES JANE' from dual union all 
     select 4, 1000003, 'CHEN ALICE' from dual union all 
     select 5, 1000003, 'MCCOY ELLIS' from dual 
    ), 
    prep (propertyid, name, rn) as (
     select propertyid, name, 
       row_number() over (partition by propertyid order by ownerid) 
     from inputs 
    ) 
select * 
from prep 
pivot (max(name) for rn in (1 as owner1, 2 as owner2)) 
order by propertyid 
; 


PROPERTYID OWNER1  OWNER2 
---------- ----------- ----------- 
    1000001 SMITH MARY SMITH JOHN 
    1000002 HUGHES JANE 
    1000003 CHEN ALICE MCCOY ELLIS 

3 rows selected. 
+0

Das hat gut funktioniert, und ich mag die 'Eingänge' =>' prep' => Arbeitsmuster. Obwohl ich zugeben muss, dass ich diese Leute eine Zeit lang googelte und dachte, dass sie echte Oracle-Funktionen waren :) Danke! – Rob

+1

lol Ich hoffe, du hast die richtige Antwort gefunden (WITH-Klausel, CTE, Unterabfrage-Factoring ...) Ich habe es früh gelernt und benutze es jetzt immer, es macht Abfragen leichter zu lesen/zu folgen. Froh, dass es geholfen hat. Prost! – mathguy