跨Allocations与InventoryAdjustLog表对同类Item求和的SQL查询需求
解决方法:关联两张表的物料汇总数据
没问题,我来帮你搞定这个SQL查询需求~我们的目标是把Allocations表的预估物料量、InventoryAdjustLog表的实际使用量,按相同物料(item)分别求和后对应展示,还要确保所有出现过的物料都能被包含进来。
步骤1:分别对两张表按物料分组求和
首先,我们需要单独计算每张表中每个物料的总量:
- 对
Allocations表,按item分组,求和amount得到预估总量:
SELECT item, SUM(amount) AS total_allocated FROM Allocations GROUP BY item
- 对
InventoryAdjustLog表,按item分组,求和usage得到实际使用总量:
SELECT item, SUM(usage) AS total_used FROM InventoryAdjustLog GROUP BY item
步骤2:关联两个汇总结果
接下来要把这两个结果通过item关联起来。这里推荐用FULL OUTER JOIN,这样就算某个物料只在其中一张表存在(比如只有预估没有实际使用,或者反过来),也能被展示出来,不会遗漏。
标准SQL版本(支持FULL OUTER JOIN的数据库:PostgreSQL、SQL Server等)
SELECT -- 取两个表中存在的item,避免NULL COALESCE(a.item, l.item) AS item, -- 把NULL替换为0,让结果更直观 COALESCE(a.total_allocated, 0) AS total_allocated, COALESCE(l.total_used, 0) AS total_used FROM ( SELECT item, SUM(amount) AS total_allocated FROM Allocations GROUP BY item ) a FULL OUTER JOIN ( SELECT item, SUM(usage) AS total_used FROM InventoryAdjustLog GROUP BY item ) l ON a.item = l.item
MySQL替代方案(MySQL不支持FULL OUTER JOIN)
如果用的是MySQL,可以用UNION ALL合并两个分组结果后再汇总:
SELECT item, SUM(total_allocated) AS total_allocated, SUM(total_used) AS total_used FROM ( -- 先把Allocations的汇总结果拼进来,实际使用量设为0 SELECT item, SUM(amount) AS total_allocated, 0 AS total_used FROM Allocations GROUP BY item UNION ALL -- 再把InventoryAdjustLog的汇总结果拼进来,预估量设为0 SELECT item, 0 AS total_allocated, SUM(usage) AS total_used FROM InventoryAdjustLog GROUP BY item ) combined GROUP BY item
验证示例数据结果
用你给出的测试数据运行以上查询,会得到如下符合预期的结果:
| item | total_allocated | total_used |
|---|---|---|
| item1 | 80 | 75 |
| item2 | 20 | 15 |
内容的提问来源于stack exchange,提问作者Bigbob556677
相关产品推荐
相关产品推荐

