如何通过LEFT JOIN汇总多行某列值并计算库存剩余量?
解决方案:将多行转移数量汇总为单行计算剩余库存
要实现把同一库存ID对应的所有转移数量求和,再计算剩余库存并显示为单行,核心是先对transfers表的转移量按stock_id聚合,再与stocks表关联。以下是两种高效实现方式:
方法一:先聚合转移数据再关联(推荐)
先通过子查询统计每个库存的总转移量,再和库存表左连接,能减少连接的数据量,性能更优:
SELECT s.id, s.quantity, COALESCE(t.total_transfer, 0) AS tquantity, s.quantity - COALESCE(t.total_transfer, 0) AS remaining FROM stocks s LEFT JOIN ( SELECT stock_id, SUM(quantity) AS total_transfer FROM transfers GROUP BY stock_id ) t ON t.stock_id = s.id WHERE s.quantity - COALESCE(t.total_transfer, 0) > 0 OR t.total_transfer IS NULL;
- 用
COALESCE处理没有转移记录的情况,避免NULL参与运算导致结果异常 - 提前聚合转移数据,减少后续连接的行数,适合数据量较大的场景
方法二:直接关联后聚合
如果数据量较小,也可以直接左连接后通过GROUP BY聚合计算:
SELECT s.id, s.quantity, SUM(t.quantity) AS tquantity, s.quantity - COALESCE(SUM(t.quantity), 0) AS remaining FROM stocks s LEFT JOIN transfers t ON t.stock_id = s.id GROUP BY s.id, s.quantity HAVING s.quantity - COALESCE(SUM(t.quantity), 0) > 0 OR SUM(t.quantity) IS NULL;
- 直接关联后按库存ID和库存数量分组,用
SUM计算总转移量 HAVING子句替代WHERE,因为需要过滤聚合后的结果
内容的提问来源于stack exchange,提问作者Belli Pier
相关产品推荐
相关产品推荐

