[英]How to create multiple MySQL counts / group by / subqueries?
我的数据库中有一个表,其中包含足球结果,相关的列是matchNumber(基于日期的数字),Result(“ W”,“ D”或“ L”),goalFor,goalAg和Manager。
我有这个查询:
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;
返回以下结果:
P W D L F A Pct
213 92 49 72 296 247 54.69
这很完美。 但是,结果跨越多个季节,我想分解查询的输出以反映这一点。 我尝试了以下方法:
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;
该查询的结果可以在以下图像中看到:
http://www.kidderminsterharriers.com/images/query2.jpg
如您所见,“季节”,“ P”,“ F”和“ A”列给了我想要的结果,但其余列重复了总数。 因此,我的问题是如何调整我的查询,以使“ W”,“ D”和“ L”列在输出的每一行中也逐年提供总计而不是总计?
问题是您的三个子查询没有按季节限制它们的数量。 尝试将其更改为:
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)=@season) AS W,
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "D" AND LEFT(matchNumber,4)=@season) AS D,
(SELECT COUNT(*) FROM match_results WHERE manager = 13 AND Result = "L" AND LEFT(matchNumber,4)=@season) 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.