2009-12-23 5 views
0

J'ai une table dans ma base de données contenant des résultats de football, les colonnes correspondantes étant matchNumber (un nombre basé sur la date), Result (W, D ou L) goalsFor, goalsAg et manager.Comment créer plusieurs comptes MySQL/groupe par/sous-requêtes?

J'ai cette requête:

SELECT COUNT(*) AS P, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "W") AS W, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "D") AS D, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "L") AS L, 
SUM(GoalsFor) AS F, 
SUM(GoalsAg) AS A, 
ROUND((SELECT SUM((((SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "W") * 2) +(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "D")))/((SELECT COUNT(*) FROM match_results WHERE manager = 13)*2)*100),2) AS pct 
FROM match_results WHERE manager = 13; 

qui renvoie le résultat suivant:

P W D L F A Pct 
213 92 49 72 296 247 54.69 

Cela fonctionne parfaitement. Cependant, les résultats couvrent un certain nombre de saisons et je veux décomposer le résultat de la requête pour refléter cela. Je l'ai essayé ce qui suit:

SELECT LEFT(matchNumber,4) AS Season, 
COUNT(*) AS P, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "W") AS W, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "D") AS D, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "L") AS L, 
SUM(GoalsFor) AS F, 
SUM(GoalsAg) AS A, 
ROUND((SELECT SUM((((SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "W") * 2) +(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "D")))/((SELECT COUNT(*) FROM match_results WHERE manager = 13)*2)*100),2) AS pct 
FROM match_results WHERE manager = 13 
GROUP BY Season; 

Le résultat de cette requête peut être vu dans cette image:

http://www.kidderminsterharriers.com/images/query2.jpg

Comme vous pouvez le voir, la 'Saison', 'P', « F 'et' A 'colonnes m'ont donné le résultat que je veux, mais les colonnes restantes sont en train de répéter les totaux. Ma question est donc comment puis-je adapter ma requête de sorte que les colonnes 'W', 'D' et 'L' me donnent également des totaux d'année en année dans chaque ligne de la production et non le total?

Répondre

2

Le problème est que vos trois sous-requêtes ne limitent pas leur nombre par saison. Essayez de changer à:

SELECT @season:=LEFT(matchNumber,4) AS Season, 
COUNT(*) AS P, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "W" AND LEFT(matchNumber,4)[email protected]) AS W, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "D" AND LEFT(matchNumber,4)[email protected]) AS D, 
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "L" AND LEFT(matchNumber,4)[email protected]) AS L, 
SUM(GoalsFor) AS F, 
SUM(GoalsAg) AS A, 
ROUND((SELECT SUM((((SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "W") * 2) +(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "D")))/((SELECT COUNT(*) FROM match_results WHERE manager = 13)*2)*100),2) AS pct 
FROM match_results WHERE manager = 13 
GROUP BY Season; 
+0

Merci pour la suggestion, mais cela ne fonctionne pas, il renvoie l'erreur « Unknown column « mr.Season » dans 'où la clause » – AndrewDFrazier

+0

D'accord, je l'ai mis à jour ma réponse. Il utilise maintenant une variable '@ season' qui semble fonctionner dans les sous-requêtes – cmptrgeekken

+0

Oui, cela fonctionne, c'est exactement ce que je viens d'essayer. Merci. – AndrewDFrazier

Questions connexes