Oracle
 sql >> Database >  >> RDS >> Oracle

Pivoting di righe in colonne in modo dinamico in Oracle

Oracle 11g fornisce un PIVOT operazione che fa quello che vuoi.

Soluzione Oracle 11g

select * from
(select id, k, v from _kv) 
pivot(max(v) for k in ('name', 'age', 'gender', 'status')

(Nota:non ho una copia di 11g su cui testarlo, quindi non ne ho verificato la funzionalità)

Ho ottenuto questa soluzione da:http://orafaq.com/wiki/PIVOT

EDIT -- opzione pivot xml (anche Oracle 11g)
Apparentemente esiste anche un pivot xml opzione per quando non conosci tutte le possibili intestazioni di colonna di cui potresti aver bisogno. (vedi il TIPO XML sezione nella parte inferiore della pagina situata all'indirizzo http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html)

select * from
(select id, k, v from _kv) 
pivot xml (max(v)
for k in (any) )

(Nota:come prima non ho una copia di 11g su cui testarlo, quindi non ne ho verificato la funzionalità)

Modifica2: v modificato nel pivot e pivot xml dichiarazioni a max(v) poiché dovrebbe essere aggregato come menzionato in uno dei commenti. Ho anche aggiunto il in clausola che non è facoltativa per pivot . Ovviamente, dovendo specificare i valori nel in La clausola vanifica l'obiettivo di avere una query pivot/crosstab completamente dinamica come era il desiderio del poster di questa domanda.