sql >> Base de Datos >  >> RDS >> Oracle

Pivotar filas en columnas dinámicamente en Oracle

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.