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.