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 :

[SQL] Requête classement sport


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Par défaut [SQL] Requête classement sport
    Bonjour

    je vous explique mon probleme :

    Je voudrais générer un classement entre des joueurs à partir des résultats de matchs de tennis de table.

    J'ai pour l'instant créé les tables suivantes :

    TABLE Liste_Joueur

    ID_Joueur --- Nom_Joueur
    ---1 ----------- Dupont
    ---2 ----------- Camus
    ---3 ----------- Mercier

    TABLE Resultats_Matchs

    ID_Match --- Joueur_1 --- Joueur_2 --- Score_Joueur_1 --- Score_Joueur_2
    --- 1 -------- Dupont ---- Mercier ---------- 21 ---------------- 15
    --- 2 -------- Mercier ---- Camus ---------- 17 ---------------- 21
    --- 3 -------- Camus ----- Dupont ---------- 21 ---------------- 13
    --- 4 -------- Mercier ---- Dupont ---------- 21 ---------------- 10

    Je cherche à calculer pour chaque joueur le nombre de matchs joués et le nombre de victoire dans le genre :

    ID_Joueur --- Nom_Joueur --- Nb_Matchs --- Nb_Victoires
    ---1 ----------- Dupont --------- X -------------- Y
    ---2 ----------- Camus ---------- X -------------- Y
    ---3 ----------- Mercier --------- X -------------- Y

    Tout ça pour faire un classement entre les joueurs.

    J'arrive à déterminer facilement le vainqueur pour chaque match grace à des Iif, mais j'ai du mal à compter le nombre de matchs joués par joueur et le nombre de victoire...

    Je n'arrive pas pour le moment à le faire avec une requète, si vous avez des idées ou des conseils ils sont les bienvenus.

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Avec les tables suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE TABLE T_JOUEUR_JOR
    (JOR_ID  INT NOT NULL PRIMARY KEY, 
     JOR_NOM CHAR(8))
     
    INSERT INTO T_JOUEUR_JOR VALUES (1, 'Dupont')
    INSERT INTO T_JOUEUR_JOR VALUES (2, 'Camus')
    INSERT INTO T_JOUEUR_JOR VALUES (3, 'Mercier')
     
    CREATE TABLE T_MATCH_MTH
    (MTH_ID     INT NOT NULL PRIMARY KEY, 
     JOR_ID1    INT FOREIGN KEY REFERENCES T_JOUEUR_JOR (JOR_ID),
     JOR_ID2    INT FOREIGN KEY REFERENCES T_JOUEUR_JOR (JOR_ID),
     MTH_SCORE1 INT,
     MTH_SCORE2 INT,
     CONSTRAINT CK_JOUEURS CHECK(JOR_ID1 <> JOR_ID2))
     
    INSERT INTO T_MATCH_MTH VALUES (1, 1, 3, 21, 15)
    INSERT INTO T_MATCH_MTH VALUES (2, 3, 2, 17, 21)
    INSERT INTO T_MATCH_MTH VALUES (3, 2, 1, 21, 13)
    INSERT INTO T_MATCH_MTH VALUES (4, 3, 1, 21, 10)
    voici une première approche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            SELECT JOR_ID, JOR_NOM, MTH_ID, MTH_SCORE1, 
                   'DEFENSEUR' AS JOUE,
                   CASE 
                      WHEN MTH_SCORE1 > MTH_SCORE2 THEN 1
                      WHEN MTH_SCORE1 < MTH_SCORE2 THEN 0
                      ELSE NULL
                   END AS GAGNE          
            FROM   T_MATCH_MTH AS M
                   INNER JOIN T_JOUEUR_JOR AS DEFENSEUR
                         ON M.JOR_ID1 = DEFENSEUR.JOR_ID
            UNION
            SELECT JOR_ID, JOR_NOM, MTH_ID, MTH_SCORE1, 
                   'ADVERSAIRE' AS JOUE,
                   CASE 
                      WHEN MTH_SCORE1 < MTH_SCORE2 THEN 1
                      WHEN MTH_SCORE1 > MTH_SCORE2 THEN 0
                      ELSE NULL
                   END AS GAGNE          
            FROM   T_MATCH_MTH AS M
                   INNER JOIN T_JOUEUR_JOR AS DEFENSEUR
                         ON M.JOR_ID2 = DEFENSEUR.JOR_ID
    Qui donne le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    JOR_ID      JOR_NOM  MTH_ID      MTH_SCORE1  JOUE       GAGNE       
    ----------- -------- ----------- ----------- ---------- ----------- 
    1           Dupont   1           21          DEFENSEUR  1
    1           Dupont   3           21          ADVERSAIRE 0
    1           Dupont   4           21          ADVERSAIRE 0
    2           Camus    2           17          ADVERSAIRE 1
    2           Camus    3           21          DEFENSEUR  1
    3           Mercier  1           21          ADVERSAIRE 0
    3           Mercier  2           17          DEFENSEUR  0
    3           Mercier  4           21          DEFENSEUR  1
    Dès lors un count(*) suffit pour faire le nb de match et un SUM sur gagne pour les victoires.
    Voici la requête finale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    SELECT JOR_ID, JOR_NOM, COUNT(*) AS NB_MATCH,
           SUM(GAGNE) AS VICTOIRES
    FROM   (SELECT JOR_ID, JOR_NOM, MTH_ID, MTH_SCORE1, 
                   'DEFENSEUR' AS JOUE,
                   CASE 
                      WHEN MTH_SCORE1 > MTH_SCORE2 THEN 1
                      WHEN MTH_SCORE1 < MTH_SCORE2 THEN 0
                      ELSE NULL
                   END AS GAGNE          
            FROM   T_MATCH_MTH AS M
                   INNER JOIN T_JOUEUR_JOR AS DEFENSEUR
                         ON M.JOR_ID1 = DEFENSEUR.JOR_ID
            UNION
            SELECT JOR_ID, JOR_NOM, MTH_ID, MTH_SCORE1, 
                   'ADVERSAIRE' AS JOUE,
                   CASE 
                      WHEN MTH_SCORE1 < MTH_SCORE2 THEN 1
                      WHEN MTH_SCORE1 > MTH_SCORE2 THEN 0
                      ELSE NULL
                   END AS GAGNE          
            FROM   T_MATCH_MTH AS M
                   INNER JOIN T_JOUEUR_JOR AS DEFENSEUR
                         ON M.JOR_ID2 = DEFENSEUR.JOR_ID) AS T
    GROUP BY JOR_ID, JOR_NOM
    Qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JOR_ID      JOR_NOM  NB_MATCH    VICTOIRES   
    ----------- -------- ----------- ----------- 
    2           Camus    2           2
    1           Dupont   3           1
    3           Mercier  3           1
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [SQL]: Requête NOT IN SELECT(...)
    Par CAPPE dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/06/2005, 14h06
  2. Réponses: 2
    Dernier message: 06/06/2005, 15h13
  3. [SQL] Requête complexe avec appel multiple à la même table
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/04/2005, 14h12
  4. [PL/SQL]requête imbriquée
    Par Nadine dans le forum Oracle
    Réponses: 6
    Dernier message: 01/02/2005, 16h21
  5. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10

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