2017-09-19 4 views
-3

Ich habe ein Oracle-Tabellennamen als Berufe wie:Pivot in oracle

NAME  OCCUPATION  
Ashley Professor 
Samantha Actor 
Julia  Doctor 
Britney Professor 
Maria  Professor 
Meera  Professor 
Priya  Doctor 
Priyanka Professor 
Jennifer Actor 
Ketty  Actor 
Belvet Professor 
Naomi  Professor 
Jane  Singer  
Jenny  Singer 
Kristeen Singer 
Christeen Singer 
Eve  Actor 

Ich mag meine Schlüssel in Spalten mit Klar SQL einzuschalten (nicht PL/SQL), so dass die resultierenden Tabelle etwas aussehen würde dies wie:

DOCTOR PROFESSOR SINGER  ACTOR  
Julia Ashley  Christeen Eve  
Priya Belvet  Jane  Jennifer  
Null Britney  Jenny  Ketty     
Null Maria  Kristeen Samantha  
Null Meera  Null  Null    
Null Naomi  Null  Null 
Null Priyanka Null  Null 

ich verwende folgende Abfrage für diese:

select * from 
(select name,occupation,RANK() over (partition by occupation order by name) as rank from occupations) 
pivot (
max(name) 
for occupation in ('Doctor', 'Professor', 'Singer', 'Actor') 
); 

Aber diese Abfrage geben Fehler wie sQL commond nicht richtig beendet.

+3

Sie nicht schreiben den Fehler – user5226582

+0

Wenn Sie uns die Fehlermeldung schreiben müssen helfen wollen. Erwartet nicht, dass wir raten. – APC

+0

sql commond nicht richtig beendet. Das war der Fehler, dude –

Antwort

0

Ihre Abfrage entsprechend Ihrer Anforderung ist passend nicht:

bitte beachten Sie: da in relationalen Datenbank, für jede Zeile, sollten Spalten Beziehung zu einander haben, aber entsprechend Ihrer Anforderung col1 und col2 ist nicht Haben Sie irgendeine Beziehung, so können wir etwas wie unten tun Bitte überprüfen Sie dies.

select  min (case upper(OCCUPATION) when 'DOCTOR' then name end) as DOCTOR 
      ,min (case upper(OCCUPATION) when 'PROFESSOR' then name end) as PROFESSOR 
      ,min (case upper(OCCUPATION) when 'SINGER' then name end) as SINGER 
      ,min (case upper(OCCUPATION) when 'ACTOR' then name end) as ACTOR 

from  (select name,OCCUPATION 
         ,row_number() over ( partition by name,OCCUPATION order by OCCUPATION) as rn 

      from  test where upper(OCCUPATION) IN ('DOCTOR','PROFESSOR','SINGER','ACTOR') 
      ) 

group by  name,OCCUPATION 
order by  1,2,3,4 ; 

OUTPUT

DOCTOR PROFESSOR SINGER ACTOR 
Julia   
Priya   
     Ashley  
     Belvet  
     Britney  
     Maria   
     Meera   
     Naomi   
     Priyanka  
       Christeen 
       Jane 
       Jenny 
       Kristeen 
           Eve 
           Jennifer 
           Ketty 
           Samantha 
0

Dies sollte Sie das Ergebnis geben Sie suchen. Das nächste Mal wäre eine Tabelle zu erstellen und Anweisungen als Ausgangspunkt für die Arbeit zu verwenden.

create table t (
     name  varchar2(100), 
     occupation varchar2(100) 
); 

insert into t values ('Ashley' ,'Professor'); 
insert into t values ('Samantha' ,'Actor'); 
insert into t values ('Julia'  ,'Doctor'); 
insert into t values ('Britney' ,'Professor'); 
insert into t values ('Maria'  ,'Professor'); 
insert into t values ('Meera'  ,'Professor'); 
insert into t values ('Priya'  ,'Doctor'); 
insert into t values ('Priyanka' ,'Professor'); 
insert into t values ('Jennifer' ,'Actor'); 
insert into t values ('Ketty'  ,'Actor'); 
insert into t values ('Belvet' ,'Professor'); 
insert into t values ('Naomi'  ,'Professor'); 
insert into t values ('Jane'  ,'Singer');  
insert into t values ('Jenny'  ,'Singer'); 
insert into t values ('Kristeen' ,'Singer'); 
insert into t values ('Christeen' ,'Singer'); 
insert into t values ('Eve'  ,'Actor'); 

WITH doctor AS 
(SELECT row_number() over(ORDER BY NAME) AS rn, 
     NAME 
    FROM t 
    WHERE occupation = 'Doctor'), 
professor AS 
(SELECT row_number() over(ORDER BY NAME) AS rn, 
     NAME 
    FROM t 
    WHERE occupation = 'Professor'), 
singer AS 
(SELECT row_number() over(ORDER BY NAME) AS rn, 
     NAME 
    FROM t 
    WHERE occupation = 'Singer'), 
actor AS 
(SELECT row_number() over(ORDER BY NAME) AS rn, 
     NAME 
    FROM t 
    WHERE occupation = 'Actor') 
SELECT d.name AS doctor, 
     p.name AS professor, 
     s.name AS singer, 
     a.name AS actor 
    FROM (SELECT LEVEL AS lvl 
      FROM dual 
     CONNECT BY LEVEL <= (SELECT MAX(ct) 
           FROM (SELECT COUNT(*) AS ct 
             FROM t 
             GROUP BY occupation))) x 
    LEFT JOIN doctor d 
    ON d.rn = x.lvl 
    LEFT JOIN professor p 
    ON p.rn = x.lvl 
    LEFT JOIN singer s 
    ON s.rn = x.lvl 
    LEFT JOIN actor a 
    ON a.rn = x.lvl; 

Results