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 06/05/2011, 17h54   #1
Invité de passage
 
Femme
Chef de projet en SSII
Inscription : mai 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 1
Points : 0
Points : 0
Par défaut 2 jointures sur la même table

Bonjour,

J'essaie de faire une requête qui fasse intervenir 2 fois la même table, mais avec des champs et des critères différents.

J'ai beaucoup cherché, mais je n'ai pas trouvé exactement mon cas et ça fait bien longtemps que je n'ai plus pratiqué SQL.

Je vous fais un exemple (je précise tout de suite que je ne peux pas intervenir sur la structure des tables) :

Table client :
No : identifiant
Nom : nom du client

Table mouvements :
ID : identifiant
No de client : pointe sur le champ No de la table client
Type : 2 valeurs possible, vente ou achat
Coût : valeur dans le cas d'un achat
Prix : valeur dans le cas d'un prix

Mon problème est le suivant : les champs coût et prix contiennent toujours une valeur, et dans le cas d'un mouvement de type vente, je ne dois tenir compte que du prix, et dans le cas d'un mouvement de type achat, je ne dois tenir compte que du coût

J'aimerais obtenir quelque chose comme ça

No client Nom du client total des achats total des ventes
1 Client A 1490 1600
2 Client B 900 1150

En partant des tables suivantes :

Client
No Nom
1 Client A
2 Client B

Mouvements
ID No de client Type Coût Prix
100 1 Achat 1200 34
101 1 Achat 290 16
102 1 Vente 300 1600
103 2 Achat 900 870
104 2 Vente 340 500
105 2 Vente 1100 650

Je me perds dans les jointures. J'arrive bien à avoir mes coûts d'achats par une requete en joignant mouvement et client, j'arrive bien à avoir mes prix de vente, mais pas les deux en même temps.

Merci d'avoir tout lu, et merci de votre aide.

Arnaud
ablondel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 18h04   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

tu peux utiliser
soit le CASE
soit le UNION

Code :
1
2
3
4
5
6
SELECT ....
     CASE 
          WHEN  Type = 'Achat' THEN Cout
          WHEN  Type = 'Vente' THEN Prix
FROM
    .....
ou

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT ...
       Cout
FROM
    .....
WHERE Type = 'Achat'
UNION
SELECT ...
       Prix
FROM
    .....
WHERE Type = 'Vente'
a+
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 02h29   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Oui il faut utiliser CASE couplé avec la fonction d'aggrégation SUM en l'occurence.
Code :
1
2
3
4
5
6
SELECT c.no,c.nom,
       sum(case when m.type = 'achat' then m.cout end) AS cout_total,
       sum(case when m.type = 'vente' then m.prix end) AS prix_total
  FROM client c
  JOIN mouvements m ON c.no = m.num_client
 GROUP BY c.no,c.nom
PS : par défaut si ELSE n'est pas spécidié dans CASE alors c'est ELSE NULL, et le NULL est ignoré par le SUM.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 09h05   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
skuatamad
tu as raison, j'avais fait abstraction de
Citation:
total des achats total des ventes
et javais oublie le END dans la forme CASE

a+
dehorter olivier 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 09h16.


 
 
 
 
Partenaires

Hébergement Web