2016-08-18 6 views
0

Ich wurde diese Frage in einem Interview gestellt und konnte es nicht knacken. Ich habe eine Employee-Tabelle mit folgenden WertenTransponiere alle Zeilen in Spalten in Oracle

Id Name Sal 
1 Sid 1000 
2 Jon 800 
3 Ram 600 

Ich mag die Ausgabe wie folgt angezeigt werden:

1  2  3 
Sid Jon  Ram 
1000 800  600 

d.h Zeilen in Spalten.

Ich verwendete Fall/decode für das selbe. Aber er brauchte eine andere Antwort, da es viel mehr Spalten geben konnte und er nicht für alle Dekodieren verwenden wollte. Ich suchte im Internet nach Pivot und einigen anderen Funktionen, konnte aber keine Abfrage erstellen, die mir diese Ausgabe liefern könnte. Ist es möglich, die Ausgabe in dem oben genannten Format zu erhalten? Wenn ja, kann ich die Abfrage dafür bekommen. Ich benutze Orakel.

Vielen Dank im Voraus.

Antwort

0

könnten Sie listagg() verwenden:

select listagg(id, ' ') within group (order by id) as list from employee union all 
select listagg(name, ' ') within group (order by id) from employee union all 
select listagg(sal, ' ') within group (order by id) from employee 

oder so etwas wie dieses PL/SQL-Block:

declare 
    type lines is varray(3) of varchar2(32767); 
    ls lines := lines('', '', ''); 
begin 
    for r in (select id, name, sal from employee) loop 
    ls(1) := ls(1)||r.id||' '; 
    ls(2) := ls(2)||r.name||' '; 
    ls(3) := ls(3)||r.sal||' '; 
    end loop; 
    for i in 1..3 loop dbms_output.put_line(ls(i)); end loop; 
end; 
+0

Danke für die Antwort, aber soll ich nicht PL/SQL verwenden. Auch wenn es 30 Spalten in einer Tabelle gibt, müsste ich gemäß der gegebenen Abfrage 29 'Union all' verwenden, was nicht machbar ist. Gibt es eine andere Methode? – kash

+0

Hmmm ... Keine 'Decodierung', keine Verbindungen, keine PL/SQL ;-) Ich kenne die anderen Möglichkeiten nicht, vielleicht andere Benutzer. –