Pivotement des lignes dans les colonnes de façon dynamique dans Oracle
J'ai de la suite Oracle 10g table appelée _kv:
select * from _kv
ID K V
---- ----- -----
1 name Bob
1 age 30
1 gender male
2 name Susan
2 status married
J'aimerais changer mes clés dans les colonnes à l'aide de la plaine SQL (pas de PL/SQL), de sorte que le tableau devrait ressembler à quelque chose comme ceci:
ID NAME AGE GENDER STATUS
---- ----- ----- ------ --------
1 Bob 30 male
2 Susan married
- La requête doit avoir autant de colonnes que unique
K
s existent dans la table (il n'y en a pas tant que ça) - Il n'y a aucun moyen de savoir ce que les colonnes peuvent exister avant l'exécution de la requête.
- J'essaie d'éviter l'exécution d'une requête initiale pour en programmant construire la requête finale.
- Les cellules vides peuvent être null ou une chaîne vide, n'a pas vraiment d'importance.
- Je suis en utilisant Oracle 10g, mais un 11g solution serait aussi ok.
Il y a beaucoup d'exemples pour quand vous savez ce que pivoté colonnes peut être appelé, mais je ne peux pas trouver un générique de pivotement solution pour Oracle.
Merci!
- Cher Dieu, est que d'un... la méta DB??
- Vous devriez lire ceci: stackoverflow.com/questions/7340422/...
- J'ai toujours trouvé de l'humour dans la lecture de ce sujet de la personne morale, la valeur de l'attribut " tables: asktom.oracle.com/pls/apex/...
- Malheureusement, ce n'est pas ma conception (et la _kv tableau est un exemple)... j'ai besoin de générer des rapports en temps réel à partir de cette table, et toute tentative de filtre ou d'une ordonnance est juste me rend fou.
- wow, si vous vouliez une valeur de clé de paire db, vous êtes trop cher énormément de l'utilisation d'Oracle. Regarder dans la base de données Berkeley (toujours gratuit, mais, ironiquement, contrôlée par Oracle ;). Mieux encore, la modification d'ventouse... à tout prix. bonne chance
- Je pense que cette clause: "j'essaie d'éviter l'exécution d'une requête initiale pour en programmant construire la requête finale." va être la partie la plus difficile à surmonter. Je pense que @Dave est correct dans leur recommandation, mais vous peut être limitée à une 'me mes colonnes" interroger ensuite une dynamique de pivot construire au large de l') -->j'espère que quelqu'un prouve que j'ai tort - je ne vois pas comment vous serez en mesure d'éviter que les!
Vous devez vous connecter pour publier un commentaire.
Oracle 11g fournit un
PIVOT
opération qui fait ce que vous voulez.Oracle 11g solution
(Note: je n'ai pas de copie de 11g pour tester cela, donc je ne l'ai pas vérifié ses fonctionnalités)
J'ai obtenu cette solution à partir de: http://orafaq.com/wiki/PIVOT
EDIT -- pivot xml option (également Oracle 11g)
Apparemment, il y a aussi un
pivot xml
option lorsque vous ne connaissez pas tous les en-têtes de colonne que vous pourriez avoir besoin. (voir la de TYPE XML section près du bas de la page située à http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html)(Note: Comme avant, je n'ai pas de copie de 11g pour tester cela, donc je ne l'ai pas vérifié ses fonctionnalités)
Edit2: Changé
v
dans lepivot
etpivot xml
déclarationsmax(v)
puisqu'il est censé être regroupées comme mentionné dans un des commentaires. J'ai aussi ajouté lein
clause qui n'est pas une option pourpivot
. Bien sûr, avoir à spécifier les valeurs de lain
clause de défaites le but d'avoir une dynamique de pivot/requête analyse croisée comme ce fut le désir de cette question de l'affiche.pivot(v for k)
partie n'est pas de travail en 11g, lafor
besoin d'unin
, et je ne sais pas quoi mettre dans cettein
clausein
clause peut être facultatif si vous voulait limiter le nombre de colonnes à des valeurs spécifiques et qu'il pourrait être laissé de côté si toutes les valeurs ont été voulu. Apparemment, il y a unpivot xml
option qui traite de ce ( voir la mise à jour de la réponse ).(max(v) for k in (any))
, mais le résultat est le xml dans un clob colonne appeléeK_XML
- pas tout à fait ce dont j'ai besoin.À faire face à des situations où il y a une possibilité de plusieurs valeurs (v dans votre exemple), j'utilise
PIVOT
etLISTAGG
:Puisque vous voulez des valeurs dynamiques, l'utilisation du SQL dynamique et transmettre les valeurs déterminées par l'exécution d'un select sur la table de données avant d'appeler le pivot déclaration.
Arriver à avoir une tâche sur pivot. Ci-dessous fonctionne pour moi aussi testé tout à l'heure de 11g:
Tout d'abord, dynamique de pivot à l'aide de
pivot xml
nouveau doit être analysée. Nous avons un autre moyen de le faire en stockant les noms de colonne dans une variable et de les passer dans le sql dynamique comme ci-dessous.Considérons que nous avons un tableau comme ci-dessous.
Si nous avons besoin d'afficher les valeurs dans la colonne
YR
que les noms de colonnes et les valeurs dans les colonnes deQTY
, alors nous pouvons utiliser le code ci-dessous.RÉSULTAT
listagg('''' || YR || ''' as "' || YR || '"', ',')
. pourquoi ne paslistagg(YR, ',')
? ce n''''' ||
faire là-dedans?