是否可以使用BETWEEN子句在单个查询中统计不同日期范围的游戏销售总额(可使用或不使用CASE语句)
修正你的SQL查询错误
让我帮你梳理下这段SQL里的问题,主要有两处关键错误导致执行失败:
1. 缺少GROUP BY子句
当你使用SUM()这类聚合函数时,SELECT列表中的非聚合字段(比如Publisher、Year)必须被包含在GROUP BY子句中。数据库需要明确知道要按照哪些维度来分组计算总和,否则无法正确执行聚合操作。
2. CASE语句逻辑与类型不匹配
你的CASE表达式存在两个问题:
- 前面的分支都返回
SUM(Global_Sales)(数值型),但ELSE部分写的是Year > 2009(布尔型,返回true/false),数据类型不统一,数据库会报错。 - 从需求来看,你应该是想把年份划分成不同的区间类别(比如"Pre-1989"、"1990-1999"),而不是每个区间都返回总和,所以CASE的逻辑需要调整为返回区间名称。
修正后的查询(按发行商+年份分组,同时标记年份区间)
如果你需要按每个发行商每年的销量统计,同时标注年份所属区间,可以用这个版本:
SELECT Publisher, Year, SUM(Global_Sales) AS total_games_sold, CASE WHEN Year < 1989 THEN 'Pre-1989' WHEN Year BETWEEN 1990 AND 1999 THEN '1990-1999' WHEN Year BETWEEN 2000 AND 2009 THEN '2000-2009' ELSE '2010+' END AS date_range FROM Vgsales GROUP BY Publisher, Year ORDER BY Year;
备选版本(按发行商+年份区间分组统计总销量)
如果你的需求是按发行商和年份区间来汇总总销量,可以用这个版本:
SELECT Publisher, CASE WHEN Year < 1989 THEN 'Pre-1989' WHEN Year BETWEEN 1990 AND 1999 THEN '1990-1999' WHEN Year BETWEEN 2000 AND 2009 THEN '2000-2009' ELSE '2010+' END AS date_range, SUM(Global_Sales) AS total_games_sold FROM Vgsales GROUP BY Publisher, date_range ORDER BY MIN(Year); -- 按区间的最早年份排序,保证顺序正确
内容的提问来源于stack exchange,提问作者DataAnalystTableau
相关产品推荐
相关产品推荐

