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 :

Existe-t-il une requête pour cela?


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 13
    Points : 4
    Points
    4
    Par défaut Existe-t-il une requête pour cela?
    Bonjour,

    ça fait un moment que je cherche mais bon j'ai franchement pas un bon niveau en sql et je n'arrive pas à trouver.

    Voici mon cas :

    Prenons ces 2 tables:

    ID | nom | prénom | age
    ---------------------------
    1 | dupont | jean | 32
    2 | dupuis | pierre | 38
    3 | dethier | paul | 45

    ET

    ID | proprio_ID | objet | valeur
    ---------------------------------
    1 | 1 | bijoux | 1000
    2 | 1 | meuble | 5000
    3 | 2 | bijoux | 1200
    4 | 2 |peintures| 3000
    5 | 3 |peintures| 8000


    Existe-t-il une requête SQL qui retournerait cela:

    ID | nom | prénom | age | bijoux | meuble | peintures
    -----------------------------------------------------------
    1 | dupont | jean | 32 | 1000 | 5000 | ----
    2 | dupuis | pierre | 38 | 1200 | ---- | 3000
    3 | dethier | paul | 45 | ---- | ---- | 8000


    Un super GRAND merci à celui qui veux bien me répondre

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Ce que tu souhaites faire est un PIVOT qui ne fait pas partie des clauses standard du langage SQL pour la simple raison qu'il n'est pas possible à l'avance de connaître le nombre de colonnes que retournera un tel type de requête.
    Si tu travailles avec SQL Server ou Access, tu trouveras une clause PIVOT dans les extensions du langage non conformes à la norme, avec les limites énoncées précédemment.
    Avec tout autre SGBD, tu pourras écrire une requête de cette forme, mais tu devras la faire évoluer en fonction des types d'objets que tu dois prendre en compte :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    SELECT  prs.id
        ,   prs.nom
        ,   prs.prenom
        ,   prs.age
        ,   SUM(obj.bijoux)     bijoux
        ,   SUM(obj.meubles)    meubles
        ,   SUM(obj.peintures)  peintures
    FROM    personne    prs
        INNER JOIN
            (   SELECT  proprio_id
                    ,   valeur  bijoux
                    ,   null    meubles
                    ,   null    peintures   
                FROM    objets
                WHERE   objet   = 'bijoux'
            UNION
                SELECT  proprio_id
                    ,   null    bijoux
                    ,   valeur  meubles
                    ,   null    peintures   
                FROM    objets
                WHERE   objet   = 'meubles'
            UNION
                SELECT  proprio_id
                    ,   null    bijoux
                    ,   null    meubles
                    ,   valeur  peintures   
                FROM    objets
                WHERE   objet   = 'peintures'
            )   obj
            ON  prs.id  = obj.proprio_id
    GROUP BY prs.id
        ,   prs.nom
        ,   prs.prenom
        ,   prs.age     
    ;
    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
    Inscrit en
    Mars 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 13
    Points : 4
    Points
    4
    Par défaut Merci beaucoup
    Super! merci beaucoup pour la leçon. Cela dit, il me reste encore une petite énigme et vu que tu as l'air vraiment calé, je me permet d'en profiter

    Si le cas était le suivant :

    ID | nom | prénom | age
    ---------------------------
    1 | dupont | jean | 32
    2 | dupuis | pierre | 38
    3 | dethier | paul | 45

    ET

    ID | proprio_ID | objet | valeur
    ---------------------------------
    1 | 1 | bijoux | un peu
    2 | 1 | meuble | beaucoup
    3 | 2 | bijoux | un peu
    4 | 2 |peintures| beaucoup
    5 | 3 |peintures| énormément


    En considérant qu'il n'y aura pas deux entrées du même objet pour le même propriétaire existe-t-il toujours une requête SQL qui retournerait cela:

    ID | nom | prénom | age | bijoux | meuble | peintures
    -----------------------------------------------------------
    1 | dupont | jean | 32 | un peu | beaucoup | ----
    2 | dupuis | pierre | 38 | un peu | ---- | beaucoup
    3 | dethier | paul | 45 | ---- | ---- | énormément


    Mon exemple est un peu niais mais bon ce que je veux dire par là, c'est :

    Dans la solution que tu m'as généreusement donnée est-il possible de grouper les résultats par ID mais non pas de faire une somme des valeurs mais de dire que l'on souhaite que la valeur prenne le pas sur NULL.

    Je ne sais pas si je suis très claire.

    Encore un grand MERCI.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Il y a d'autres fonctionS de regroupement que SUM... Essaye un peu avec MAX
    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
    Inscrit en
    Mars 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 13
    Points : 4
    Points
    4
    Par défaut Super Merci
    Merci beaucoup, c'est vraiment génial de pouvoir avoir les conseils d'un vrai pro.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il y a plus court et plus efficace comme requête de PIVOT :
    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
      SELECT prs.id
           , prs.nom
           , prs.prenom
           , prs.age
           , SUM(case obj.objet when 'bijoux'    then obj.valeur end) as bijoux
           , SUM(case obj.objet when 'meubles'   then obj.valeur end) as meubles
           , SUM(case obj.objet when 'peintures' then obj.valeur end) as peintures
        FROM personne prs
             INNER JOIN objets obj
             ON obj.proprio_id = prs.id
       WHERE obj.objet in ('bijoux', 'meubles', 'peintures')
    GROUP BY prs.id
           , prs.nom
           , prs.prenom
           , prs.age

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/09/2006, 16h09
  2. EDBEngineError sur une requête pour MySQL
    Par Slyteck dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/08/2006, 14h17
  3. Réponses: 2
    Dernier message: 02/06/2006, 20h17
  4. Une requête pour éditer plusieurs lignes.
    Par Anduriel dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/05/2006, 20h24
  5. Une requête pour un débutant...
    Par Viper7 dans le forum Access
    Réponses: 3
    Dernier message: 11/04/2006, 21h46

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