Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pivoter dynamiquement des lignes dans des colonnes dans Oracle

Oracle 11g fournit un PIVOT opération qui fait ce que vous voulez.

Solution Oracle 11g

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

(Remarque :je n'ai pas de copie de 11g pour tester cela, donc je n'ai pas vérifié sa fonctionnalité)

J'ai obtenu cette solution à partir de :http://orafaq.com/wiki/PIVOT

MODIFIER -- option pivot xml (également Oracle 11g)
Apparemment, il y a aussi un pivot xml option lorsque vous ne connaissez pas tous les en-têtes de colonne possibles dont vous pourriez avoir besoin. (voir le TYPE XML section vers le bas de la page située à 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) )

(Remarque :comme avant, je n'ai pas de copie de 11g pour tester ceci, donc je n'ai pas vérifié sa fonctionnalité)

Edit2 : v modifié dans le pivot et pivot xml déclarations à max(v) car il est censé être agrégé comme mentionné dans l'un des commentaires. J'ai aussi ajouté le in clause qui n'est pas optionnelle pour pivot . Bien sûr, devoir spécifier les valeurs dans le in clause va à l'encontre de l'objectif d'avoir une requête pivot/crosstab complètement dynamique comme c'était le souhait de l'affiche de cette question.