Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2011, 22h20   #1
Invité de passage
 
Kevin Pire
Inscription : mars 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : Kevin Pire

Informations forums :
Inscription : mars 2010
Messages : 10
Points : 0
Points : 0
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
nexuskmd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 00h11   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
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 :
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/05/2011, 08h15   #3
Invité de passage
 
Kevin Pire
Inscription : mars 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : Kevin Pire

Informations forums :
Inscription : mars 2010
Messages : 10
Points : 0
Points : 0
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.
nexuskmd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 09h58   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 21h48   #5
Invité de passage
 
Kevin Pire
Inscription : mars 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : Kevin Pire

Informations forums :
Inscription : mars 2010
Messages : 10
Points : 0
Points : 0
Par défaut Super Merci

Merci beaucoup, c'est vraiment génial de pouvoir avoir les conseils d'un vrai pro.
nexuskmd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 11h21   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il y a plus court et plus efficace comme requête de PIVOT :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h27.


 
 
 
 
Partenaires

Hébergement Web