如何用MySQL计算每位艺术家每次练习会话的平均练习歌曲数
解决思路与SQL实现
我懂你要的需求——就是算出每位艺术家每次练习会话平均练了多少首歌对吧?你之前遇到的AVG()嵌套COUNT()报错的问题,核心原因是SQL里聚合函数不能直接嵌套使用,得拆成分两步来处理:
第一步:先统计单次练习的歌曲数
首先我们需要按「艺术家+练习会话」分组,算出每一次练习里实际包含的歌曲数量。这里要注意如果同一个练习里同一首歌可能被重复记录的话,记得用COUNT(DISTINCT Song_ID)去重,否则直接用COUNT(Song_ID)就行。
第二步:计算平均练习歌曲数
基于第一步的结果,再按艺术家分组,用AVG()计算这些单次练习歌曲数的平均值,就是你要的最终结果。
完整SQL代码
SELECT Artist_ID, ROUND(AVG(songs_per_practice), 2) AS avg_songs_per_practice -- 用ROUND保留两位小数更直观 FROM ( -- 子查询:生成每个艺术家每次练习的歌曲数量列表 SELECT Artist_ID, Practice_ID, COUNT(Song_ID) AS songs_per_practice -- 如果有重复记录,替换成 COUNT(DISTINCT Song_ID) FROM Songs_Practices -- 如果你要限定时间(比如今年),可以加WHERE条件: -- WHERE YEAR(关联的练习日期字段) = YEAR(CURRENT_DATE) GROUP BY Artist_ID, Practice_ID ) AS practice_summary GROUP BY Artist_ID;
为什么之前的写法会报错?
你尝试的AVG(COUNT(Song_ID))属于聚合函数嵌套,SQL引擎无法直接处理这种逻辑——因为COUNT()是对分组后的结果做统计,而AVG()需要的是一组数值,必须先通过子查询把内层聚合的结果先计算出来,变成一个可被外层聚合的数据集,才能正常计算平均值。
内容的提问来源于stack exchange,提问作者user3498517
相关产品推荐
相关产品推荐

