You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可以使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:43:15