能否按主查询字段分组子查询?MLB比赛日志统计问题
解决西雅图水手队客场对阵美联球队的分组胜负统计问题
问题核心
需要统计西雅图水手队(SEA)2017年后客场对阵美联(AL)球队的打击数据(安打H、本垒打HR、打点RBI等),并按主队分组,同时要按主队分别统计水手队在该客场的胜负场次。原SQL中的子查询返回的是水手队作为主队的整体胜负数,而非作为客队对阵特定主队时的胜负,且尝试统计主场获胜场次时错误得到总比赛数。
原代码问题分析
- 两个子查询未关联外层查询的
home_team,无论外层分组是哪个主队,子查询都返回水手队作为主队的总胜场/总负场,完全不符合需求。 - 直接用
(home_team_score < visitor_team_score)统计胜负时,未过滤水手队作为客队的条件,导致统计结果是所有客队获胜的总场次,而非分组后的对应场次。
修正后的SQL代码
-- 西雅图水手队2017年后客场对阵美联球队的打击数据+分组胜负统计 SELECT home_team AS 对阵主队, COUNT(entry_id) AS 比赛场数G, -- 统计水手队(客队)获胜场次:客队得分>主队得分 SUM(CASE WHEN visitor_team_score > home_team_score THEN 1 ELSE 0 END) AS 胜场W, -- 统计水手队(客队)失利场次:客队得分<主队得分 SUM(CASE WHEN visitor_team_score < home_team_score THEN 1 ELSE 0 END) AS 负场L, SUM(visitor_at_bats) AS 打数AB, SUM(visitor_hits) AS 安打H, ROUND(CAST(SUM(visitor_hits) AS DECIMAL)/SUM(visitor_at_bats), 3) AS 打击率AVG, SUM(visitor_home_runs) AS 本垒打HR, SUM(visitor_doubles) AS 二垒安打, SUM(visitor_triples) AS 三垒安打, SUM(visitor_rbi) AS 打点RBI, SUM(visitor_so) AS 三振SO, SUM(visitor_bb) AS 保送BB, SUM(visitor_lob) AS 残垒LOB FROM GAME_LOG_ENTRY WHERE visit_team = 'SEA' -- 水手队作为客队 AND home_league = 'AL' -- 主队属于美联 AND game_date > '2017-01-01'-- 2017年后的比赛 GROUP BY home_team ORDER BY 胜场W DESC;
关键修正点
- 条件聚合替代子查询:通过
SUM(CASE ...)直接在分组统计中计算每个主队对应的水手队胜负场次,避免无关联子查询的错误,同时提升查询性能。 - 修正打击率计算精度:将安打数转为
DECIMAL类型,避免整数除法导致的精度丢失,确保打击率结果准确。 - 移除无效分组字段:原代码中
GROUP BY home_team, W, L是错误的,修正后仅按home_team分组即可。 - 明确胜负判断逻辑:水手队作为客队,获胜条件为
visitor_team_score > home_team_score,失利条件为visitor_team_score < home_team_score,可根据需求补充平局场次统计。
内容的提问来源于stack exchange,提问作者badperson
相关产品推荐
相关产品推荐

