如何在给定SQL查询中对casa和visitante字段求和得到goles
解决方法:将casa和visitante字段相加得到总进球数
嘿,这个需求很好解决,我给你两种实用的方案,顺便提个容易忽略的逻辑坑:
方法一:直接在SELECT中计算总和
因为SQL里同一层SELECT的别名不能直接用来计算(大部分数据库引擎都有这个限制),所以我们可以直接把两个SUM表达式相加,同时也可以保留原来的casa和visitante字段:
SELECT SUM(IF(idcasa = 254, gcasa, 0)) AS casa, SUM(IF(idvisitante = 254, gvisitante, 0)) AS visitante, SUM(IF(idcasa = 254, gcasa, 0)) + SUM(IF(idvisitante = 254, gvisitante, 0)) AS goles FROM partido WHERE idpais = 1 AND idtemporada = 1 AND idcategoria = 1 AND (idcasa = 254 OR idvisitante = 254); -- 这里必须加括号!
重要提醒:WHERE条件的优先级
你原来的WHERE语句有个隐藏问题:AND的优先级比OR高,原语句里的idcasa = 254 or idvisitante = 254 and idpais = 1 ...会被数据库解析成:
idcasa = 254 OR (idvisitante = 254 AND idpais = 1 AND idtemporada = 1 AND idcategoria = 1)
这显然不是你想要的逻辑——你应该是想筛选出「(主队是254或客队是254) 并且满足国家、赛季、分类条件」的记录,所以一定要给OR的两个条件加上括号,确保逻辑正确。
方法二:用子查询/CTE先统计再相加
如果你的逻辑更复杂,或者想要代码可读性更高,可以先通过子查询或CTE算出casa和visitante,再在外部查询中相加:
子查询版本
SELECT casa, visitante, casa + visitante AS goles FROM ( SELECT SUM(IF(idcasa = 254, gcasa, 0)) AS casa, SUM(IF(idvisitante = 254, gvisitante, 0)) AS visitante FROM partido WHERE idpais = 1 AND idtemporada = 1 AND idcategoria = 1 AND (idcasa = 254 OR idvisitante = 254) ) AS partido_subquery;
CTE版本(适合MySQL 8+、PostgreSQL等支持CTE的数据库)
WITH partido_stats AS ( SELECT SUM(IF(idcasa = 254, gcasa, 0)) AS casa, SUM(IF(idvisitante = 254, gvisitante, 0)) AS visitante FROM partido WHERE idpais = 1 AND idtemporada = 1 AND idcategoria = 1 AND (idcasa = 254 OR idvisitante = 254) ) SELECT casa, visitante, casa + visitante AS goles FROM partido_stats;
这两种方法的好处是,后续如果需要修改统计逻辑,只需要修改子查询/CTE部分即可,外部的计算逻辑不用动,可读性更强。
内容的提问来源于stack exchange,提问作者Isaac Palacio
相关产品推荐
相关产品推荐

