SQL分组拼接实现:按年份统计胜负场次并格式化为W-L形式
正确SQL写法及解释
核心思路
直接通过年份分组,结合CASE WHEN和聚合函数COUNT分别统计每年的胜场、负场,最后用字符串拼接函数组合成W-L格式(不同数据库拼接语法略有差异,以下以SQL Server和MySQL为例)。
SQL Server 版本
SELECT YEAR(Date) AS GameYear, CONCAT( COUNT(CASE WHEN Result = 'W' THEN 1 END), '-', COUNT(CASE WHEN Result = 'L' THEN 1 END) ) AS WinLossRecord FROM GameSummaries GROUP BY YEAR(Date) ORDER BY GameYear;
错误原因解析
- Msg 207: Invalid column name 'Date':分组时不能直接引用原始
Date列(它包含具体日期,不是分组维度),必须用提取年份的表达式(比如YEAR(Date)),且GROUP BY子句要和SELECT里的年份表达式完全一致。 - Msg 116:你之前的写法大概率在
SELECT中使用了返回多列的子查询,但非EXISTS场景下子查询只能返回单列。改用CASE WHEN结合聚合函数,可直接在分组查询内完成统计,规避子查询的问题。
MySQL 适配版本
SELECT YEAR(Date) AS GameYear, CONCAT( COUNT(CASE WHEN Result = 'W' THEN 1 END), '-', COUNT(CASE WHEN Result = 'L' THEN 1 END) ) AS WinLossRecord FROM GameSummaries GROUP BY YEAR(Date) ORDER BY GameYear;
补充说明
- 确认
Result字段的胜/负取值为明确的'W'和'L',若存在平局(如'T')等其他状态,上述查询会自动忽略,需调整逻辑可自行扩展CASE WHEN分支。 - 若
Date字段存在NULL值,可通过YEAR(ISNULL(Date, '1900-01-01'))(SQL Server)或YEAR(IFNULL(Date, '1900-01-01'))(MySQL)处理,但通常比赛日期不会为空。
内容的提问来源于stack exchange,提问作者Jim Becker
相关产品推荐
相关产品推荐

