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 :

Requête SQL, transformer des lignes en colonne


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Requête SQL, transformer des lignes en colonne
    Bonjour,

    Je suis un peu bloqué avec une requete SQL que je dois faire. J'ai regardé sur google, mais je n'ai pas vraiment trouvé la réponse à ma question.
    Je ne sais pas si mon besoin relève d'une requete croisée (PIVOT ?)...

    Je suis en php avec une base MySql

    Voilà ce que je veux faire (j'ai simplifié):

    J'ai une table qui contient 3 colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id    critere     valeur
    345    1            1
    345    2            0
    345    3            0
    345    4            1
    345    5            0
    Je voudrais avoir dans ma projection ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id    critere1     critere2      critere3    critere4    critere5
    345      1             0              0             1            0

    Mon but c'est de pouvoir afficher les résultats en fonction des conditions suivantes, par exemple :
    La liste des ID qui ont 1 pour le critère 4
    La liste des ID qui ont 1 pour le critère 4 et le critère 1
    La liste des ID qui ont 1 pour le critère 4 et qui ont 0 pour le critère 5

    Il y a peut etre une autre solution, mais là je suis la tête dans le guidon, j'ai épuisé tous mes neurones.

    Merci pour votre aide !

    Je sais bien que ce sujet a du déjà être traité à mainte reprises, mais malgré cela je n'ai pas trouvé LA solution claire et précise.

    Cédric

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 098
    Points : 28 406
    Points
    28 406
    Par défaut
    En effet, c'est un sujet traité très régulièrement.

    La dernière fois, c'était ici
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour le lien, j'ai pu faire quelques tests.
    Toutefois je ne m'en sors pas, mais je pense que je n'en suis pas loin.

    Quand j'utilise la requête suivante ça ne remplit que le premier champ.

    Code : 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
    17
    18
    19
    20
    21
    22
    SELECT  
                ANN_CODE,
                annonce.RACE,
                NO,
            CASE no_critere WHEN 1 THEN valeur END  AS taille1,
            CASE no_critere WHEN 2 THEN valeur END  AS taille2,
            CASE no_critere WHEN 3 THEN valeur END  AS taille3,
            CASE no_critere WHEN 4 THEN valeur END  AS entretien4,
            CASE no_critere WHEN 5 THEN valeur END  AS entretien5,
            CASE no_critere WHEN 6 THEN valeur END  AS entretien6        
            FROM                
                 annonce 
                 LEFT JOIN p_race_liste 
                     ON 
                         annonce.RACE=p_race_liste.RACE_LIBELLE 
                     LEFT JOIN p_criteres_races 
                     ON 
                         p_criteres_races.no_race=p_race_liste.NO 
            WHERE
    annonce.animal_code=2 
            GROUP BY 
                ANN_CODE
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    6049    Staffordshire Bull Terrier    396    0    NULL    NULL    NULL    NULL    NULL
    Quand j'utilise la même requête mais sans l'instruction group by, ça remplit bien les champs mais un champ par ligne (ce qui parait logique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    6049    Staffordshire Bull Terrier    396    0    NULL    NULL    NULL    NULL    NULL
    6049    Staffordshire Bull Terrier    396    NULL    1    NULL    NULL    NULL    NULL
    6049    Staffordshire Bull Terrier    396    NULL    NULL    0    NULL    NULL    NULL
    6049    Staffordshire Bull Terrier    396    NULL    NULL    NULL    1    NULL    NULL
    6049    Staffordshire Bull Terrier    396    NULL    NULL    NULL    NULL    0    NULL
    6049    Staffordshire Bull Terrier    396    NULL    NULL    NULL    NULL    NULL    0
    Pour info, voici l'extrait du résultat "normal" tout en ligne :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    6049    Staffordshire Bull Terrier    396    1    0
    6049    Staffordshire Bull Terrier    396    2    1
    6049    Staffordshire Bull Terrier    396    3    0
    6049    Staffordshire Bull Terrier    396    4    1
    6049    Staffordshire Bull Terrier    396    5    0
    6049    Staffordshire Bull Terrier    396    6    0
    6049    Staffordshire Bull Terrier    396    7    1
    6049    Staffordshire Bull Terrier    396    8    1
    Un petit coup de main sera le bienvenue !

    Merci à tous

    Cédric

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 098
    Points : 28 406
    Points
    28 406
    Par défaut
    Deux corrections dans ta requête :

    1. La requête dont tu t'es inspiré utilisait un SUM... et celui-ci avait son intérêt
    2. Toutes les colonnes qui ne font pas l'objet d'un calcul à l'aide d'une fonction de rergoupement doivent apparaître dans la clause GROUP BY. La majorité des SGBD refusent une requête qui ne respecte pas cette règle de syntaxe. MySQL est plus "permissif" mais il retourne des données aléatoires et imprévisibles dans les colonnes qui ne sont pas listées dans les critères de regroupement.

    Code : 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
    17
    18
    19
    20
    SELECT  ann_code
        ,    annonce.race
        ,    no
        ,    SUM(CASE no_critere WHEN 1 THEN valeur END)  AS taille1
        ,    SUM(CASE no_critere WHEN 2 THEN valeur END)  AS taille2
        ,    SUM(CASE no_critere WHEN 3 THEN valeur END)  AS taille3
        ,    SUM(CASE no_critere WHEN 4 THEN valeur END)  AS entretien4
        ,    SUM(CASE no_critere WHEN 5 THEN valeur END)  AS entretien5
        ,    SUM(CASE no_critere WHEN 6 THEN valeur END)  AS entretien6        
    FROM    annonce 
        LEFT JOIN 
            p_race_liste 
            ON    annonce.race = p_race_liste.race_libelle 
        LEFT JOIN
            p_criteres_races 
            ON    p_criteres_races.no_race = p_race_liste.no 
    WHERE    annonce.animal_code = 2 
    GROUP BY ann_code
        ,    annonce.race
        ,    no
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci pour tes conseils, c'est parfait j'obtiens le bon résultat !

    A+

    Cédric

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête SQL mettre des ligne dans des colonnes
    Par karim66 dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/02/2012, 20h57
  2. Transformer des lignes en colonnes
    Par Gomoz dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/02/2009, 17h55
  3. Transformer des lignes en colonne DataStage
    Par bnet2 dans le forum DataStage
    Réponses: 4
    Dernier message: 09/12/2008, 10h07
  4. Transformer des lignes en colonnes
    Par ofinot dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 30/07/2008, 11h45
  5. [T-SQL] Convertir des lignes en colonne
    Par cortex93 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/12/2005, 16h17

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