如何用SQL计算多首歌曲平均评分总和得到艺人总评分
SQL实现逻辑及正确写法
实现思路
- 先按
songID对ratings表分组,计算出每首歌曲的平均评分 - 将歌曲平均评分的结果和
songs表关联,拿到每首歌对应的艺人 - 最后按
artist分组,对该艺人所有歌曲的平均评分求和,得到艺人总评分
通用SQL写法(兼容所有主流数据库)
SELECT s.artist, SUM(song_avg.rating_avg) AS artist_total_score FROM ( -- 内层查询:计算每首歌的平均评分 SELECT songID, AVG(rating) AS rating_avg FROM ratings GROUP BY songID ) AS song_avg INNER JOIN songs s ON song_avg.songID = s.songID GROUP BY s.artist;
进阶写法(支持CTE的数据库可用,可读性更高)
如果使用的是MySQL 8.0+、PostgreSQL、SQL Server等支持公用表表达式的数据库,可以用更清晰的CTE写法:
WITH song_avg_rating AS ( SELECT songID, AVG(rating) AS rating_avg FROM ratings GROUP BY songID ) SELECT s.artist, SUM(sar.rating_avg) AS artist_total_score FROM song_avg_rating sar INNER JOIN songs s ON sar.songID = s.songID GROUP BY s.artist;
原有写法问题说明
你之前的写法存在两个核心问题:
- 硬编码指定
songID,无法适配全量数据的计算需求 - 不支持直接嵌套聚合函数
SUM(AVG()),必须通过两次分组分步计算才能实现需求
内容的提问来源于stack exchange,提问作者ItsMeBrille
相关产品推荐
相关产品推荐

