如何在单SQL查询中统计特定类型商品的价格总和(规避子查询)
最优解决方案:使用窗口函数(Window Functions)
嘿,这个场景我太熟悉了——既要查全量商品数据,又要同时拿到特定分类的总价,还得避免子查询拖垮性能。直接用窗口函数就完美解决,只需要一次表扫描,性能拉满。
给你写个具体的SQL示例,直接替换你的基础查询就行:
SELECT product.name, product.type, product.price, -- 用CASE筛选符合条件的商品,SUM结合窗口函数计算全局总和 SUM(CASE WHEN product.type IN (1, 2) THEN product.price ELSE 0 END) OVER () AS total_target_price FROM product;
为什么这比子查询好?
- 性能优势:窗口函数只需要扫描一次
product表,全程在同一次查询中完成计算。而如果用子查询(比如SELECT ..., (SELECT SUM(price) FROM product WHERE type IN (1,2)) FROM product),数据库会为每一行商品都执行一次子查询,数据量越大性能越差,复杂业务场景下简直是灾难。 - 结果完整性:窗口函数不会像
GROUP BY那样合并行,你能拿到每一条商品的完整信息,同时在每行都能看到目标分类的总价(如果觉得每行重复显示总价没必要,后续业务层过滤即可,SQL层面这样是最灵活的)。
如果之后你需要按其他维度(比如按商品品牌分组统计目标类型总价),只需要调整OVER()里的内容就行,比如OVER(PARTITION BY brand),扩展性超强。
内容的提问来源于stack exchange,提问作者Bernard Polman




