SQLite查询需求:仅显示最低采购额+最少采购量的媒体类型行
解决SQLite中查询采购量最少且总额最低媒体类型的问题
你的需求是返回唯一一行,对应采购量最少且采购总额最低的媒体类型,但当前查询返回多行,核心问题在于两个子查询是全局统计,没有和分组关联,且未做筛选排序。
当前问题代码
SELECT M.name AS 'MediaType Name', (SELECT MIN(I.unitprice * I.quantity) FROM tracks) AS 'Minimum Total Purchase Value', (SELECT COUNT(I.Quantity) FROM invoice_items) AS 'Total Number of Purchase' FROM media_types M JOIN tracks T JOIN invoice_items I ON M.MediaTypeId = T.MediaTypeId AND T.trackid = I.trackid GROUP BY M.name
问题分析
- 你写的两个子查询都是全局统计:第一个取所有track的最小单笔订单金额,第二个取所有invoice_items的记录数,完全没有按媒体类型分组计算,所以每个媒体类型行都显示相同的错误数值。
- 没有对分组后的结果做排序和筛选,无法定位到采购总额最低且采购量最少的那一行。
修正后的代码
SELECT M.name AS 'MediaType Name', SUM(I.unitprice * I.quantity) AS 'Total Purchase Value', SUM(I.quantity) AS 'Total Number of Purchase' FROM media_types M JOIN tracks T ON M.MediaTypeId = T.MediaTypeId JOIN invoice_items I ON T.trackid = I.trackid GROUP BY M.name ORDER BY `Total Purchase Value` ASC, `Total Number of Purchase` ASC LIMIT 1;
代码说明
- 分组计算指标:用
SUM(I.unitprice * I.quantity)计算每个媒体类型的总采购额,SUM(I.quantity)计算总采购量,这两个聚合函数会和GROUP BY M.name关联,得到每个类型的真实数据。 - 排序规则:先按总采购额升序(找最低总额),再按总采购量升序(总额相同时找最少采购量)。
- 限制结果行数:用
LIMIT 1只取排序后的第一行,就是你要的目标结果。
内容的提问来源于stack exchange,提问作者ara
相关产品推荐
相关产品推荐

