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 :

2 jointures sur la même table


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    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 : 1
    Points
    1
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    bonjour

    tu peux utiliser
    soit le CASE
    soit le UNION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ....
         CASE 
              WHEN  Type = 'Achat' THEN Cout
              WHEN  Type = 'Vente' THEN Prix
    FROM
        .....
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Oui il faut utiliser CASE couplé avec la fonction d'aggrégation SUM en l'occurence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    skuatamad
    tu as raison, j'avais fait abstraction de
    total des achats total des ventes
    et javais oublie le END dans la forme CASE

    a+
    Merci d'ajouter un sur les tags qui vous ont aidé

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

Discussions similaires

  1. [1.x] Jointure sur une même table
    Par tyx dans le forum Symfony
    Réponses: 1
    Dernier message: 04/08/2008, 11h19
  2. Auto jointure (sur une même table)
    Par freestyler dans le forum Langage SQL
    Réponses: 16
    Dernier message: 20/05/2008, 15h16
  3. Réponses: 3
    Dernier message: 12/06/2007, 23h31
  4. [MySQL] requête avec jointure sur la même table
    Par gwena54 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/05/2007, 11h22
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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