2017-02-01 2 views
1

Ich möchte eine Liste der customer_ids mit den oberen fünf Adressen anzeigen, die als Spalten neben ihnen basierend auf der Anzahl von Claims_count angezeigt werden. Ist es möglich mit PIVOT?Oracle SQL-Prioritäts-basierte Pivot

CREATE TABLE pivot_test (
customer_id NUMBER, 
claims_count NUMBER, 
address VARCHAR2(5) 
); 

INSERT INTO pivot_test VALUES (1,23,'A'); 
INSERT INTO pivot_test VALUES (1,2,'B'); 
INSERT INTO pivot_test VALUES (1,43,'C'); 
INSERT INTO pivot_test VALUES (1,0,'D'); 
INSERT INTO pivot_test VALUES (1,34,'E'); 
INSERT INTO pivot_test VALUES (1,23,'F'); 
INSERT INTO pivot_test VALUES (2,6,'A'); 
INSERT INTO pivot_test VALUES (2,3,'B'); 
INSERT INTO pivot_test VALUES (2,67,'C'); 
COMMIT; 

das gewünschte Ergebnis wäre so etwas wie:

customer_id Address1 Address2 Address3 Address4 Address5 
1     C   E   A   F   B 
2     C   A   B 
+0

Was ist die "Priorität" in Ihrem Titel? Auch bei den Adressen, wie entscheidest du, was Adresse1 ist und welche Adresse 2 usw. (oder kann es zufällig sein? Oder bezieht es sich auf die "Priorität", die du vergessen hast zu diskutieren?) Und wie werden die Werte 'A ',' B 'von Ihrer Eingabe werden Kleinbuchstaben' a 'und' b 'in der Ausgabe? – mathguy

+0

Danke, dass du das ausrufst, ich werde daran arbeiten, die Frage zu aktualisieren. – mjanach

Antwort

1

PIVOT Verwendung:

select * 
from (
    select 
     customer_id, 
     address, 
     row_number() over (partition by customer_id order by claims_count desc) rn 
    from pivot_test t 
) 
pivot (
    max(address) for rn in (
     1 as Address1, 
     2 as Address2, 
     3 as Address3, 
     4 as Address4, 
     5 as Address5 
    ) 
); 

Demo:

SQL> select * 
    2 from (
    3 select 
    4  customer_id, 
    5  address, 
    6  row_number() over (partition by customer_id order by claims_count desc) rn 
    7 from pivot_test t 
    8 ) 
    9 pivot (
10 max(address) for rn in (
11  1 as Address1, 
12  2 as Address2, 
13  3 as Address3, 
14  4 as Address4, 
15  5 as Address5 
16 ) 
17 ); 

CUSTOMER_ID ADDRE ADDRE ADDRE ADDRE ADDRE 
----------- ----- ----- ----- ----- ----- 
      1 C  E  A  F  B 
      2 C  A  B 

SQL> 
+0

Ich habe eine zusätzliche Anforderung hinzugefügt, danke für Ihre Antwort, es funktionierte perfekt für die ursprüngliche Frage. – mjanach

2

ich dies mit bedingter Aggregation tun würde:

select customer_id, 
     max(case when seqnum = 1 then address end) as address_1, 
     max(case when seqnum = 2 then address end) as address_2, 
     max(case when seqnum = 3 then address end) as address_3, 
     max(case when seqnum = 4 then address end) as address_4, 
     max(case when seqnum = 5 then address end) as address_5 
from (select pt.*, 
      row_number() over (partition by customer_id order by customer_id) as seqnum 
     from pivot_test pt 
    ) pt 
group by customer_id; 
+0

'partition by customer_id' und dann innerhalb jeder Partition' order by customer_id'? Wozu? "order by null" hätte den gleichen Effekt und die Bedeutung wäre viel klarer. – mathguy

+0

Danke für deine Antwort, es hat genau das gemacht, was ich für die ursprüngliche Frage wollte, die ich gestellt habe. – mjanach

Verwandte Themen