SQLite中Chinook数据库查询各专辑总价格的SQL问题排查
问题根因
你的表关联逻辑是正确的,仅返回单条汇总结果的核心问题是:使用SUM()聚合函数统计总价时,缺少GROUP BY分组子句。没有分组的前提下,SQL会将两表关联后的所有行合并为一个分组做聚合计算,自然只能得到全量数据的总价总和,无法按单张专辑拆分统计。
你选择LEFT JOIN的写法完全适配SQLite环境,也符合需求:可以保留albums表中所有专辑记录,即使某张专辑没有关联音轨也不会被过滤,不需要使用FULL OUTER JOIN。
修正后代码
建议按专辑主键AlbumId分组(避免同名专辑导致统计错误),如果需要将无音轨专辑的总价显示为0而非NULL,可以搭配COALESCE()函数处理空值:
SELECT a.Title, COALESCE(SUM(t.UnitPrice), 0) AS TotalPrice FROM albums a LEFT JOIN tracks t ON t.AlbumId = a.AlbumId GROUP BY a.AlbumId, a.Title ORDER BY a.Title;
注意事项
- 若不需要处理无音轨专辑的空值,可直接去掉
COALESCE()函数,写为SUM(t.UnitPrice) AS TotalPrice即可 - 不建议仅按
a.Title字段分组:极端场景下如果存在同名不同ID的专辑,仅按标题分组会将多张专辑的价格合并统计,用主键AlbumId作为分组依据才能保证统计粒度准确。
内容的提问来源于stack exchange,提问作者je1227
相关产品推荐
相关产品推荐

