IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Nom de colonne dans une colonne : comment faire un select dynamique ?


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut Nom de colonne dans une colonne : comment faire un select dynamique ?
    Bonjour,

    J'ai 2 Tables:

    Table1
    Id | IdTable2 | Val1 | Val2 | Val3
    1 | 1 | 11 | 8 | 6
    2 | 3 | 15 | 20 | 12
    [...]


    Table2
    Id | NomColTable1
    1 | Val2
    2 | Val1
    3 | Val3
    4 | Val2
    [...]

    Comment récupérer pour chaque Id de Table2 la valeur contenu dans Table1 ?
    En gros:
    1 | 8
    3 | 12


    Si possible compatible Oracle (11) / SQL (2008)
    Merci !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        select t2.Id
             , case t2.NomColt1 when 'Val1' then t1.Val1 else 0 end
             + case t2.NomColt1 when 'Val2' then t1.Val2 else 0 end
             + case t2.NomColt1 when 'Val3' then t1.Val3 else 0 end as Val
          from Table1 t1
    inner join Table2 t2
            on t2.Id = t1.IdTable2;

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Les éléments présentés sont fictifs, vu le nom des tables et colonnes, mais s'ils sont fidèles à la structure réelle, il y a semble t-il un gros problème de conception !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    CinePhil
    je te le fais pas dire ! Mais je peux pas faire grand chose

    Waldar
    Disons qu'il peut y avoir plusieurs dizaine de ValX... je souhaitais idéalement éviter les cases...

    Merci d'avoir pris le temps de me lire !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    La conséquence d'une mauvaise modélisation, c'est bien du SQL casse-tête derrière, et encore ici ça reste simple.
    Soit vous revoyez la modélisation et on écrit une autre requête, soit vous ne pouvez pas toucher à la modélisation et je vous souhaite du courage.

    Notez que vous pouvez quand même vous appuyer sur les vues du catalogue pour générer votre requête (user_tab_columns chez Oracle / information_schema.columns chez SQL-Server), qui n'a pas vocation à trop être modifiée une fois écrite.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ben t'es dans la m... !
    Tu as le droit d'engueuler celui qui a pondu cette horreur !

    Soit tu normalises les données en créant une table de ce style :
    idTable2 / NumVal / Val
    1 / Val1 / 11
    1 / Val2 / 8
    1 / Val3 / 6
    ...

    Soit tu crées une procédure SQL.


    Bon courage !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Hier je me suis creusé un peu la tête aussi pour aider un collègue, mais je suis pas forcement hyper bon en sql...

    C'est pour ca que j'ai posé la question ici; mais visiblement c'est pas vraiment possible de faire une tel requête dynamique...

    Merci pour votre expertise !

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Une autre solution sera de faire une vue sur Table1 qui passe le pivot en lignes, de façon à interroger proprement la vue, comme si la table était correctement modélisée.

    Par exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    create view v_table1
    as
    select id, id_table2, 'val1' as numval, val1
    from table1
    union all
    select id, id_table2, 'val2', val2
    from table1
    union all
    select id, id_table2, 'val3', val2
    from table1
    union all
    [...]
    union all
    select id, id_table2, 'valX', valX
    from table1;

    Ainsi, vous pourrez interroger votre vue de la sorte :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select t2.id
    inner join v_table1 v1 on v1.table2_id = t2.id and v1.numval = t2.col
    from table2 t2

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    StringBuilder
    je cherchais une solution dynamique, sans avoir besoin de spécifier Val1 / Val2....

    Une sorte de select sur une colonne dynamique...

    Mais bon je pense que c'est pas réalisable, et c'est logique :b

    Merci !

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Vous pouvez cependant automatiser la création de ces vues avec un script.

    Waldar vous à aiguiller la dessus :
    Notez que vous pouvez quand même vous appuyer sur les vues du catalogue pour générer votre requête (user_tab_columns chez Oracle / information_schema.columns chez SQL-Server), qui n'a pas vocation à trop être modifiée une fois écrite.

  11. #11
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    bonjour
    si tu es sous Oracle, tu peux utiliser un script qui génère un sql dynamique à l'aide de l'instruction execute immediate

    un lien qui peux t'aider.

    http://sheikyerbouti.developpez.com/execute_immediate/

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/10/2012, 08h50
  2. [XL-2007] comment trouver une colonne dans une BD par son nom via VBA
    Par chikitin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2010, 08h52
  3. Comment faire un "remplacer" dans une colonne d'une table ?
    Par arnaudperfect dans le forum Requêtes
    Réponses: 7
    Dernier message: 22/02/2008, 12h32
  4. Ecrire les noms des fichiers dans une colonne
    Par REGIMBAL dans le forum Access
    Réponses: 1
    Dernier message: 20/04/2006, 11h29
  5. Noms de colonne dans une colonne
    Par Digirom dans le forum Langage SQL
    Réponses: 14
    Dernier message: 23/04/2004, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo