[SQL] Requête pour récupérer le classement d'un championnat [Résolu]

Requête pour récupérer le classement d'un championnat [Résolu] [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 16-05-2006 à 17:12:00    

Bonjour à tous,
 
je développe actuellement un site sur le championnat football de L1. Mon problème pour le moment est la récupération du classement du championnat, que j'essaie d'effectuer uniquement sur ma table "match" qui recense tous les matchs.
Voici la structure de cette table :
- id
- championnat (ID du championnat)
- saison (ID de la saison)
- journee (N° de la journée)
- equipe_domicile (ID de l'équipe jouant à domicile)
- equipe_exterieur (ID de l'équipe jouant à l'extérieur)
- score_domicile (score de l'équipe jouant à domicile)
- score_exterieur (score de l'équipe jouant à l'extérieur)
- date
 
Il faut donc, pour une saison et un championnat donné, que je sorte un tableau comprenant le nombre de points cumulés de chaque équipe, sachant que lorsque :
- score_domicile > score_exterieur alors equipe_domicile a +3 points ;
- score_domicile == score_exterieur alors equipe_domicile a +1 point et equipe_exterieur a +1 point ;
- score_domicile < score_exterieur alors equipe_exterieur a +3 points ;
- si score_domicile et score_exterieur sont NULL, le match ne s'est pas encore déroulé.
 
Je ne sais pas du tout par quoi commencer, je ne suis même pas sûr que ce que je souhaite soit possible en une seule requête ?!
 
Merci pour votre aide !!!


Message édité par f L Y le 17-05-2006 à 01:42:17
Reply

Marsh Posté le 16-05-2006 à 17:12:00   

Reply

Marsh Posté le 16-05-2006 à 22:07:01    

tu utilise une base Access? oracle? mysql? autres?
tu veux une requete pour une page web ou mettre à jour ta base?

Reply

Marsh Posté le 16-05-2006 à 22:27:19    

Y a sans doute mieux mais entre 2 scenes de matrix on fait ce qu'on peut
 
SELECT SUM(t.points) Total, equipe from  
(
SELECT  equipe_domicile equipe,
 SUM (CASE  
 WHEN score_domicile > score_exterieur THEN 3
 WHEN score_domicile = score_exterieur THEN 1
 WHEN score_domicile < score_exterieur THEN 0
 END) points
FROM MATCH
GROUP BY equipe_domicile
 
UNION
 
SELECT  equipe_exterieur equipe,
 SUM (CASE  
 WHEN score_exterieur > score_domicile THEN 3
 WHEN score_exterieur = score_domicile THEN 1
 WHEN score_exterieur < score_domicile THEN 0
 END) points
FROM MATCH
GROUP BY equipe_exterieur
 
) t
group by equipe  
order by Total DESC
 
 
ps: testé en transact sql

Reply

Marsh Posté le 17-05-2006 à 01:41:15    

Merci Adelscott !
 
denischti, c'est pour une base mysql et une page web.
 
J'ai bidouillé et "tuné" un peu ta requête Adelscott pour avoir quelque chose de très complet, et ça marche niquel :
 
SELECT equipe AS equipe_id, equipe.nom AS equipe_nom, SUM(t.matchs_joues) AS matchs_joues, SUM(t.matchs_gagnes) AS victoires, SUM(t.matchs_nuls) AS nuls, SUM(t.matchs_perdus) AS defaites, SUM(t.matchs_points) AS points FROM
(
 SELECT
  equipe_domicile AS equipe,
  SUM(CASE
   WHEN score_domicile IS NOT NULL THEN 1 ELSE 0
  END) AS matchs_joues,
  SUM(CASE
   WHEN score_domicile > score_exterieur THEN 3
   WHEN score_domicile = score_exterieur THEN 1
   WHEN score_domicile < score_exterieur THEN 0 ELSE 0
  END) AS matchs_points,
  SUM(CASE
   WHEN score_domicile > score_exterieur THEN 1 ELSE 0
  END) AS matchs_gagnes,
  SUM(CASE
   WHEN score_domicile = score_exterieur THEN 1 ELSE 0
  END) AS matchs_nuls,
  SUM(CASE
   WHEN score_domicile < score_exterieur THEN 1 ELSE 0
  END) AS matchs_perdus
 FROM matche
 GROUP BY equipe
UNION
 SELECT
  equipe_exterieur AS equipe,
  SUM(CASE
   WHEN score_exterieur IS NOT NULL THEN 1 ELSE 0
  END) AS matchs_joues,
  SUM(CASE
   WHEN score_exterieur > score_domicile THEN 3
   WHEN score_exterieur = score_domicile THEN 1
   WHEN score_exterieur < score_domicile THEN 0 ELSE 0
  END) AS matchs_points,
  SUM(CASE
   WHEN score_exterieur > score_domicile THEN 1 ELSE 0
  END) AS matchs_gagnes,
  SUM(CASE
   WHEN score_exterieur = score_domicile THEN 1 ELSE 0
  END) AS matchs_nuls,
  SUM(CASE
   WHEN score_exterieur < score_domicile THEN 1 ELSE 0
  END) AS matchs_perdus
 FROM matche
 GROUP BY equipe
) AS t, equipe WHERE t.equipe = equipe.id GROUP BY equipe ORDER BY points DESC, equipe_nom ASC
 
Ca me renvoie un tableau avec ID équipe, nom équipe, nbr. de matchs joués, nbr. de victoires, nuls et défaites et nbr. de points.
Bon, il me restera également à intégrer le goal average... Ca va pas être simple non plus ça :)
 
En tout cas encore merci !

Reply

Marsh Posté le 20-05-2006 à 02:48:12    

Avec goal average
 
SELECT SUM(t.points) Total, SUM(diff) diff, equipe from  
(  
SELECT  equipe_domicile equipe,  
 SUM (CASE  
 WHEN score_domicile > score_exterieur THEN 3  
 WHEN score_domicile = score_exterieur THEN 1  
 WHEN score_domicile < score_exterieur THEN 0  
 END) points,  
SUM (score_domicile - score_exterieur) as diff
FROM MATCH  
GROUP BY equipe_domicile
 
UNION  
 
SELECT  equipe_exterieur equipe,  
 SUM (CASE  
 WHEN score_exterieur > score_domicile THEN 3  
 WHEN score_exterieur = score_domicile THEN 1  
 WHEN score_exterieur < score_domicile THEN 0  
 END) points,  
SUM (score_exterieur - score_domicile) as diff
FROM MATCH  
GROUP BY equipe_exterieur
 
) t  
group by equipe  
order by Total DESC, diff DESC


Message édité par Adelscott le 20-05-2006 à 02:55:47
Reply

Marsh Posté le 28-10-2006 à 17:59:46    

Comme demandé, une adaptation pour avoir le classement d'une equipe au fil des journées
 
Ce n'est pas tres beau mais ca fonctionne.

Code :
  1. DECLARE @Position AS INT
  2. DECLARE @PositionEquipe AS INT
  3. DECLARE @Equipe AS varchar(50)
  4. DECLARE @TotalPoints AS INT
  5. DECLARE @DiffButs AS INT
  6. DECLARE @NbreDeJournees AS INT
  7. DECLARE @EquipeConcernee AS varchar(50)
  8. SET @NbreDeJournees = 3
  9. SET @EquipeConcernee = 'Paris'
  10. CREATE TABLE [#classement] (
  11. [journee] [int] IDENTITY (1, 1) NOT NULL ,
  12. [equipe] [varchar] (50) NOT NULL,
  13. [classement] [int] NOT NULL
  14. ) ON [PRIMARY]
  15. DECLARE @journee as int
  16. SET @journee = 0
  17. WHILE @journee < @NbreDeJournees
  18. BEGIN
  19. -----------------------------------------------Boucle Journees-------------------------------------------------------------------
  20. set @journee = @journee + 1
  21. set @Position = 0
  22. DECLARE cursor_equipes CURSOR FOR
  23. SELECT SUM(t.points) Total, SUM(diff) diff, equipe from 
  24. SELECT  equipe_domicile equipe, 
  25.  SUM (CASE 
  26.  WHEN score_domicile > score_exterieur THEN 3 
  27.  WHEN score_domicile = score_exterieur THEN 1 
  28.  WHEN score_domicile < score_exterieur THEN 0 
  29.  END) points, 
  30. SUM (score_domicile - score_exterieur) as diff
  31. FROM MATCH
  32. WHERE Journee <= @journee
  33. GROUP BY equipe_domicile
  34.  
  35. UNION 
  36.  
  37. SELECT  equipe_exterieur equipe, 
  38.  SUM (CASE 
  39.  WHEN score_exterieur > score_domicile THEN 3 
  40.  WHEN score_exterieur = score_domicile THEN 1 
  41.  WHEN score_exterieur < score_domicile THEN 0 
  42.  END) points, 
  43. SUM (score_exterieur - score_domicile) as diff
  44. FROM MATCH
  45. WHERE Journee <= @journee 
  46. GROUP BY equipe_exterieur
  47.  
  48. ) t 
  49. group by equipe 
  50. order by Total DESC, diff DESC
  51. OPEN cursor_equipes
  52. FETCH NEXT FROM cursor_equipes
  53. INTO @TotalPoints, @DiffButs, @Equipe
  54. WHILE @@FETCH_STATUS = 0
  55. BEGIN
  56.  -------------------------Boucle Pour trouver le classement de l equipe-------------------------
  57.  set @Position = @Position + 1
  58.  If @Equipe = @EquipeConcernee
  59.  BEGIN
  60.   SET @PositionEquipe = @Position
  61.  END
  62.  FETCH NEXT FROM cursor_equipes
  63.  INTO @TotalPoints, @DiffButs, @Equipe
  64.  -------------------------Boucle Pour trouver le classement de l equipe-------------------------
  65. END
  66. CLOSE cursor_equipes
  67. DEALLOCATE cursor_equipes
  68. INSERT INTO #classement (classement, equipe) VALUES (@PositionEquipe, @EquipeConcernee)
  69. -----------------------------------------------Boucle Journees-------------------------------------------------------------------
  70. END
  71. SELECT  * FROM #classement
  72. drop table #classement
  73. drop table #journees


Message édité par Adelscott le 28-10-2006 à 18:10:56
Reply

Marsh Posté le 28-10-2006 à 18:03:07    

Thx mek !
 
Je testerai ça tantôt !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed