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

SQL Oracle Discussion :

Sélectionner une valeur en fonction de 2 autres valeurs.


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut Sélectionner une valeur en fonction de 2 autres valeurs.
    Bonjour,

    J'avance petit à petit à maitriser le langage SQL, mais je suis actuellement bloquer à quelque chose d'assez bête j'ai l'impression.
    Je souhaite vouloir sélectionner une valeur dans une colonne en fonction de 2 valeurs dans une autre colonne.
    De manière plus pratique, mon problème est le suivant :
    Je dispose des tables suivantes (que j'ai simplifié pour vous exposez mon problème en ne donnant que les attributs utiles ici):

    MATCH(Numero_match, Date_Match,#Score)
    SCORE(#Numero_Joueur,#Numero_Match)
    JOUEUR(Numero_Joueur,#Numero_Equipe)
    EQUIPE(Numero_Equipe, #Numero_Club,Categorie)
    Club(Numero_Club,Nom)

    Je souhaite donc déterminer un numéro de match en fonction du club de 2 équipes. Mais je n'arrive pas à faire en sorte de prendre e compte le nom des 2 équipes.
    En effet, ma requête étant la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select unique MATCH.NUMERO_MATCH 
    from ((((MATCH inner join SCORE on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH)
                   inner join JOUEUR on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR)
                   inner join EQUIPE on JOUEUR.NUMERO_EQUIPE = EQUIPE.NUMERO_EQUIPE)
                   inner join CLUB on EQUIPE.NUMERO_CLUB = CLUB.NUMERO_CLUB)
    where  MATCH.DATE_MATCH = '21-OCT-2019' and EQUIPE.NOM_CATEGORIE = 'U18' and NOM_CLUB = 'CLUB1' and NOM_CLUB = 'EQUIPE2;
    Au niveau de la jointure, oui j'aurai pu utiliser une vue pour plus de lisibilité, mais j'y vais pas à pas.
    Cette requête ne me retourne évidemment rien car le and entre le nom des 2 clubs ne représente pas ce que je veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NOM_CLUB	     NUMERO_MATCH
    -------------------- ------------
    MONTPELLIER HANDBALL		1
    IVRY HANDBALL			1
    IVRY HANDBALL			2
    PARIS UC			3
    MONTPELLIER HANDBALL		3
    PARIS UC			2
    J'aimerai, si par exemple, le nom des 2 clubs est MONTPELLIER HANDBALL et IVRY HANDBALL obtenir le numéro 1 etc. Mais je n'arrive pas à voir comment je peux regrouper cela.
    Pourriez m'éclairer sur cela ?

    Je vous en remercie d'avance.

    Barad.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 444
    Par défaut
    Bonjour,
    Vu le schéma, il faut partir de la table match, puis faire une jointure sur score, ensuite sur joueur.
    Pour finir il faut deux jointures sur la table équipe, avec un alias différent à chaque à chaque fois.
    Il faut aussi faire un "distinct", vu que tu passes par la table des joueurs, tu vas avoir une ligne par joueur/équipe.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select distinct e1.*,e2.*
    from match
    inner join score on (la jointure entre score et match)
    inner join joueur on (la jointure entre joueur et score)
    inner join equipe as e1 on (la jointure entre équipe e1 et joueur)
    inner join equipe as e2 on (la jointure entre équipe e2 et joueur)
    where (la condition de restriction)

    Tatayo.

    P.S. avant de me faire tirer dessus par les puristes , j'ai mis des * dans le select pour l'exemple. Il faut bien évidemment les remplacer par les colonnes nécessaires.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut
    Bonjour tatayo.

    Merci de ta réponse. Elle m'aide un peu plus à comprendre, il me faut 2 colonnes équipes pour pouvoir faire le choix avec 2 nom de club différents, mais dans ta requête, tu ne mentionnes pas la jointure avec CLUB pour pouvoir obtenir le nom de club associer à l'équipe.
    De mon côté, j'ai donc écrit cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct MATCH.NUMERO_MATCH 
    from MATCH inner join SCORE  on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH
                    inner join JOUEUR    on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR
                    inner join EQUIPE E1 on JOUEUR.NUMERO_EQUIPE = E1.NUMERO_EQUIPE 
                    inner join EQUIPE E2 on JOUEUR.NUMERO_EQUIPE = E2.NUMERO_EQUIPE
                    inner join CLUB      on E1.NUMERO_CLUB = CLUB.NUMERO_CLUB
                    inner join CLUB      on E2.NUMERO_CLUB = CLUB.NUMERO_CLUB
    where  MATCH.DATE_MATCH = '21-OCT-2019' and E1.NOM_CATEGORIE = 'U18' and E2.NOM_CATEGORIE = 'U18'
           and E1.NOM_CLUB = "MONTPELLIER HANDBALL" and E2.NOM_CLUB = 'IVRY HANDBALL';
    Ma jointure avec CLUB ne semble pas être bonne. Et en testant, effectivement, j'obtiens une ambiguité de colonne.
    Comment puis-je récupérer le nom de club pour les 2 equipes sans faire la jointure avec club comme cela ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 444
    Par défaut
    Telle qu'est écrite ta requête, tu considères que les deux équipes sont dans le même club.
    Donc la table club, c'est "même faute, même punition" que pour la table équipe.
    Elle doit apparaître 2 fois dans la requête, avec deux alias, disons c1 et c2, une jointure entre c1 et e1 et une autre entre c2 et e2.

    Tatayo.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut
    J'ai effectivement fait cela par la suite.
    Pour être sûr de ce que j'ai comme table, j'ai fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select distinct C1.NOM_CLUB, C2.NOM_CLUB, E1.NUMERO_EQUIPE, E2.NUMERO_EQUIPE , MATCH.NUMERO_MATCH
    from MATCH     inner join SCORE     on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH
                   inner join JOUEUR    on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR
                   inner join EQUIPE E1 on JOUEUR.NUMERO_EQUIPE = E1.NUMERO_EQUIPE 
                   inner join EQUIPE E2 on JOUEUR.NUMERO_EQUIPE = E2.NUMERO_EQUIPE
                   inner join CLUB   C1 on E1.NUMERO_CLUB = C1.NUMERO_CLUB
                   inner join CLUB   C2 on E2.NUMERO_CLUB = C2.NUMERO_CLUB
    where  MATCH.DATE_MATCH = '21-OCT-2019' and E1.NOM_CATEGORIE = 'U18' and E2.NOM_CATEGORIE = 'U18'
    J'obtiens alors la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NOM_CLUB	     NOM_CLUB		  NUMERO_EQUIPE NUMERO_EQUIPE NUMERO_MATCH
    -------------------- -------------------- ------------- ------------- ------------
    MONTPELLIER HANDBALL MONTPELLIER HANDBALL	      1 	    1		 1
    IVRY HANDBALL	     IVRY HANDBALL		      2 	    2		 2
    IVRY HANDBALL	     IVRY HANDBALL		      2 	    2		 1
    PARIS UC	     PARIS UC			      3 	    3		 2
    PARIS UC	     PARIS UC			      3 	    3		 3
    MONTPELLIER HANDBALL MONTPELLIER HANDBALL	      1 	    1		 3
    Mais j'ai l'impression de retomber dans mon problème de base, car quand je sélectionne avec 2 noms de clubs, je n'obtiens aucune colonne. Alors qu'en vérité, si j'ai C1.NOM_CLUB = 'MONTPELLIER HANDBALL' et C2.NOM_CLUB = 'IVRY HANDBALL', et que je sélectionne uniquement le numéro de match, obtenir 1.
    Quelque chose m'échappe mais je n'arrive pas bien à voir quoi...

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 444
    Par défaut
    Oups, autant pour moi.
    Il faut 2 fois la table joueur, sinon on considère qu'un même joueur est dans les deux équipes...
    Il faut aussi filtrer la requête sur le nom de l'équipe (ou du club), pour éviter d'avoi 2 lignes par match: C1.NOM_CLUB, C2.NOM_CLUB et C2.NOM_CLUB, C1.NOM_CLUB.
    Par exemple en ajoutant dans le where C1.NOM_CLUB < C2.NOM_CLUB, ou j1.numero_joueur < j2.numero_joueur.

    J'avais un doute dans ma première réponse, la prochaine fois j'écouterai mon petit doigt

    Tatayo.

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant MOE-MOA Finance
    Inscrit en
    Novembre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE-MOA Finance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 17
    Par défaut
    Bonjour,
    En suivant votre logique, même pour la table SCORE il en faut 2 Alias (puisque on a 2 joueurs différents)
    Mais j'aimerais comprendre comment sera matérialisé le score dans ton modèle. On a une nouvelle ligne dans la table Score à chaque fois qu'un joueur marque un but, c'est ça?

    Cette requête devrait répondre à ta demande:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select Distinct S1.Numero_match, C1.Nom, C2.Nom
    From   Score S1, Score S2, Equipe E1, Equipe E2, Club C1, Club C2, Joueur J1, Joueur J2
    WHERE  S1.Numero_match = S2.Numero_match
    AND    S1.Numero_Joueur = J1.Numero_Joueur
    AND    S2.Numero_Joueur = J2.Numero_Joueur
    AND    J1.Numero_Equipe = E1.Numero_Equipe
    AND    J2.Numero_Equipe = E2.Numero_Equipe
    AND    E1.Numero_Club = C1.Numero_Club
    AND    E2.Numero_Club = C2.Numero_Club
    AND    C1.Numero_Club < C2.Numero_Club
    Order by S1.Numero_Match;

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/05/2020, 14h17
  2. [XL-2010] Valeur d'une cellule en fonction de trois autres
    Par chafoo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/03/2015, 17h36
  3. Réponses: 2
    Dernier message: 28/05/2007, 09h28
  4. Sélectionner une valeur dans un RxDBLookupCombo
    Par Oluha dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/09/2005, 09h10
  5. Est-il possible de sélectionner une valeur d'un menu déroula
    Par pontus21 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/05/2005, 09h44

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