如何修改SQLite代码实现粉丝分组并计算各组平均值与统计值
问题修复方案
你的SQL代码存在两个核心问题导致分组异常和统计错误,以下是修正后的代码及说明:
关键问题分析
- 分组逻辑错误:
GROUP BY 'Distribution of Fans'中的单引号会将该内容识别为字符串常量,导致所有数据被归为同一组,最终只显示一个分组结果。SQLite支持直接按列别名分组,需去掉单引号,或直接使用CASE表达式本身作为分组依据。 - 统计计数错误:
COUNT(R.Useful = 1)这类写法无法正确统计符合条件的记录数——R.Useful = 1在SQLite中返回0或1,而COUNT()会统计所有非NULL值(包括0),结果等同于总记录数。需改用SUM()累加符合条件的1值,或结合CASE与COUNT()实现精准统计。
修正后的代码
SELECT CASE WHEN U.Fans > 0 AND U.Fans <= 20 THEN '0-20 Fans' WHEN U.Fans > 20 AND U.Fans <= 40 THEN '21-40 Fans' WHEN U.Fans > 40 AND U.Fans <= 60 THEN '41-60 Fans' WHEN U.Fans > 60 AND U.Fans <= 80 THEN '61-80 Fans' ELSE '80+ Fans' -- 处理粉丝数超出区间或<=0的情况,避免分组为NULL END AS "Distribution of Fans", AVG(U.Review_Count) AS Average_Review_Count, AVG(U.Average_Stars) AS Average_of_Average_Stars, SUM(CASE WHEN R.Useful = 1 THEN 1 ELSE 0 END) AS Useful_Count, SUM(CASE WHEN R.Funny = 1 THEN 1 ELSE 0 END) AS Funny_Count, SUM(CASE WHEN R.Cool = 1 THEN 1 ELSE 0 END) AS Cool_Count FROM User AS U INNER JOIN Review AS R ON U.Id = R.User_Id GROUP BY "Distribution of Fans" -- 用双引号包裹别名(SQLite中双引号用于标识符),或直接使用CASE表达式
额外说明
- 若SQLite配置允许,也可将GROUP BY的内容替换为完整的CASE表达式,效果与按别名分组一致。
- 新增的
ELSE '80+ Fans'能避免粉丝数不在指定区间的用户分组显示为NULL,让统计结果更完整。 SUM(CASE...)的写法可精准统计每个字段等于1的记录数,替代原错误的COUNT逻辑。
内容的提问来源于stack exchange,提问作者user25022273
相关产品推荐
相关产品推荐

