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 :

Jointure avec conditions sur plusieurs colonnes


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut Jointure avec conditions sur plusieurs colonnes
    Bonjour à tous,

    J'ai deux tables, extraites d'une première table "journal": date | pays | departement | montant

    La 1ère table "Montants2004": departement | pays | Montants2004



    Comme vous le voyez, pour la France, le champ "departement" n'est pas renseigné, car celui-ci n'a été ajouté à la table initiale qu'en 2005.

    La 2ème table "Montants2005": departement | pays | Montants2005



    A l'aide d'une jointure (externe, pour avoir tous les montants, même non renseignés) sur Montants2004 et Montants2005, j'aimerais obtenir comme résultat une table comme suit:

    departement | pays | Montants2004 | Montants2005

    Mais je n'y arrive pas. Pour obtenir ce résultat, il faudrait que la condition de ma jointure puisse porter sur le couple "pays/département", qui est unique! Mais je ne trouve pas, à moins qu'il y ait une autre solution.
    Quelqu'un a une idée?
    Things working well, no problems. Time to upgrade.

  2. #2
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Veux tu afficher la somme pour les départements francais ou faire

    75 FRANCE 45 65464564
    76 FRANCE 2652 65464564

    dans ce genre là ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par BiMouXeTTe
    75 FRANCE 45 65464564
    76 FRANCE 2652 65464564

    dans ce genre là ?
    Oui
    Things working well, no problems. Time to upgrade.

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m5.departement, m5.pays, m4.montants, m5.montants FROM Montants2004 m4, Montants2005 m5 WHERE m4.pays=m5.pays
    J'ai cru comprendre que pour tous les pays étrangers, tu as departement=99.

    Si tu veux quand même faire une jointure avec les départements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... AND (m4.departement=m5.departement OR m4.departement IS NULL)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par BiMouXeTTe

    J'ai cru comprendre que pour tous les pays étrangers, tu as departement=99.
    Oui, effectivement.

    Le problème est qu'en 2005, de nouveaux pays ont été ajoutés. Et ceux-ci n'apparaissent pas dans le résultat de ta requête, c'est pour ça que je voulais faire une jointure externe.
    Things working well, no problems. Time to upgrade.

  6. #6
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m5.departement, m5.pays, m4.montants, m5.montants FROM Montants2004 m4, Montants2005 m5 WHERE m4.pays=m5.pays OR m5.pays NOT IN (SELECT m4.pays FROM Montants2004)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    Il n'y a pas d'autre solution qu'avec la clause IN? Je suis sous mySQL...
    Et puis ça ne résout pas le problème, qui fonctionne aussi inversement (pays pour lesquels il y a du chiffre en 2004 et pas en 2005).
    En plus, je souhaite que le champ montant affiche bien 0 ou null, pour les pays/département pour lesquels il n'y a pas de chiffre sur une année donnée.
    Things working well, no problems. Time to upgrade.

  8. #8
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Je ne connais pas MySQL, mais est-ce que EXCEPTION JOIN existe et ferait l'affaire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT m5.departement, m5.pays, m4.montants, m5.montants
    FROM Montants2004 m4
    EXCEPTION JOIN Montants2005 m5 ON m5.pays = m4.pays
    WHERE m4.pays=m5.pays

  9. #9
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    EXCEPTION JOIN J'vois bien un truc spécifique à Oracle pour ça... Faut voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (SELECT m5.departement, m5.pays, m4.montants, m5.montants FROM Montants2004 m4, Montants2005 m5 WHERE m4.pays=m5.pays)
    UNION
    (
    (SELECT NULL, pays, NULL, montants FROM Montants2005)
    MINUS
    (SELECT NULL, m5.pays, m4.NULL, montants FROM Montants2004 m4, Montants2005 m5 WHERE m4.pays=m5.pays)
    )
    Par contre je ne sais pas si les unions et les différences ensemblistes sont possibles sous MySQL mais ca se tente toujours

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    S'il n'y a que les pays de 2005 qui t'intéressent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT m5.departement, m5.pays, m4.montants, m5.montants 
    FROM Montants2004 m4 RIGHT OUTER JOIN Montants2005 m5 ON m4.pays=m5.pays
    Si tous les pays t'intéressent et que mySQL supporte les FULL OUTER JOIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT m5.departement, m5.pays, m4.montants, m5.montants 
    FROM Montants2004 m4 FULL OUTER JOIN Montants2005 m5 ON m4.pays=m5.pays
    Si mySQL ne supporte pas le FULL OUTER JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT m5.departement, m5.pays, m4.montants, m5.montants 
    FROM Montants2004 m4 RIGHT OUTER JOIN Montants2005 m5 ON m4.pays=m5.pays
    UNION
    SELECT m5.departement, m5.pays, m4.montants, m5.montants 
    FROM Montants2004 m4 LEFT OUTER JOIN Montants2005 m5 ON m4.pays=m5.pays
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

Discussions similaires

  1. [XL-2010] formule avec conditions sur plusieurs colonnes
    Par hugodu28 dans le forum Excel
    Réponses: 2
    Dernier message: 28/03/2015, 01h11
  2. [XL-2003] Liste déroulante avec image sur plusieurs colonnes
    Par mimi62 dans le forum Excel
    Réponses: 3
    Dernier message: 27/09/2010, 22h05
  3. Réponses: 2
    Dernier message: 10/09/2010, 16h43
  4. Nb.si avec conditions sur 2 colonnes
    Par Gary dans le forum Excel
    Réponses: 1
    Dernier message: 08/08/2007, 16h19
  5. [VBA-E] Minimum d'une colonne avec condition sur autre colonne
    Par Currahee dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2007, 18h01

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