2009-11-24 5 views
2

ma question est, avec quelques informations générales:Transposer sélectionner les résultats avec Oracle

Je dois générer des requêtes SQL basées sur les métadonnées de table (colonnes), et le résultat est quelque chose comme:

TABLENAME1|COL1 
TABLENAME1|COL2 
TABLENAME2|COL1 
TABLENAME2|COL2 
TABLENAME2|COL3 
TABLENAME3|COL1 
TABLENAME4|COL1 
TABLENAME4|COL2 
... /*some other 1800 rows */ 

(Ouais, il est ordonné.) ce que je besoin est de transposer ces données, en fonction de la première colonne, de sorte que le produit attendu serait:

TABLENAME1|COL1|COL2|NULL 
TABLENAME2|COL1|COL2|COL3 
TABLENAME3|COL1|NULL|NULL 
TABLENAME4|COL1|COL2|NULL 
/* less then 1800 rows ;-) */ 

Est-il possible de nous Oracle SQL?

Merci d'avance!

Répondre

2

Si vous voulez générer la requête pour chaque appel ou utilisez un hardcoded décompte colonnes-max, vous pouvez faire quelque chose comme ça:

WITH tab AS 
(
    SELECT table_name, column_name FROM user_tab_cols WHERE column_id <= 4 
) -- user_tab_cols used to provide test data, use your table instead 
SELECT MAX(c1) c1, 
     MAX(c2) c2, 
     MAX(c3) c3, 
     MAX(c4) c4 
    FROM (SELECT table_name, 
       DECODE(column_id, 1, column_name) c1, 
       DECODE(column_id, 2, column_name) c2, 
       DECODE(column_id, 3, column_name) c3, 
       DECODE(column_id, 4, column_name) c4 
      FROM (SELECT table_name, 
         column_name, 
         ROW_NUMBER() OVER (PARTITION BY table_name ORDER BY column_name) column_id 
        FROM tab 
       ) 
     ) 
GROUP BY table_name 
ORDER BY table_name 

S'il suffit de l'obtenir en cette forme

TABLENAME1|COL1,COL2 
TABLENAME2|COL1,COL2,COL3 

jeter un coup d'oeil à stragg de Tom Kyte.

+0

Merci, je vais faire un essai! –

+0

Stragg de Tom Kyte avait aidé. –

1

Le mot-clé que vous cherchez est pivot. Here's un exemple de son utilisation. La syntaxe apparaît généralement les mêmes que MSSQL, et que je ne connais pas l'URL pour la documentation d'Oracle Je vais lancer le lien MSDN et nous espérons que quelqu'un qui en sait plus sur la mise en page d'Oracle que moi vais le modifier pour pointer vers leur documentation .

EDIT: Oracle documentation, recherche assez temps de pivot et vous obtiendrez les détails.

+0

Pivot a été l'un des plus cool des ajouts à frapper jamais SQL. Voulez-vous dénormaliser les résultats de vos requêtes sans colonnes codées en dur ou écrire des curseurs méchants? Pivot! – Dathan

+0

Mais cela fonctionne-t-il quand je ne sais pas combien de colonnes apparaîtront dans la table des résultats? –

+0

SQL ne permet pas de générer un nombre dynamique de colonnes, à moins de générer dynamiquement le code SQL dans votre frontal avant de l'exécuter. Si vous connaissez le nombre maximum de colonnes pouvant apparaître dans le jeu de résultats, cela devrait fonctionner correctement tant que vous ne craignez pas un tas de valeurs nulles. Merci – Donnie

Questions connexes