Oracle 11g proporciona un PIVOT
operación que hace lo que quieres.
Solución Oracle 11g
select * from
(select id, k, v from _kv)
pivot(max(v) for k in ('name', 'age', 'gender', 'status')
(Nota:no tengo una copia de 11g para probar esto, así que no he verificado su funcionalidad)
Obtuve esta solución de:http://orafaq.com/wiki/PIVOT
EDITAR:opción pivote xml (también Oracle 11g)
Aparentemente también hay un pivot xml
opción para cuando no conoce todos los encabezados de columna posibles que puede necesitar. (ver el TIPO XML cerca de la parte inferior de la página ubicada en 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:como antes, no tengo una copia de 11g para probar esto, por lo que no he verificado su funcionalidad)
Editar2: Cambiado v
en el pivot
y pivot xml
sentencias a max(v)
ya que se supone que debe agregarse como se menciona en uno de los comentarios. También agregué el in
cláusula que no es opcional para pivot
. Por supuesto, tener que especificar los valores en el in
La cláusula anula el objetivo de tener una consulta pivote/tabulación cruzada completamente dinámica, como era el deseo del póster de esta pregunta.