如何编写Oracle单查询语句从两表获取指定聚合结果
合并计划与实际成本的Oracle单查询方案
嘿,这个需求很典型,我来帮你把分开的查询合并成一条高效的Oracle语句,轻松实现按craft分组同时计算计划成本和实际成本的目标:
方法1:子查询关联(FULL JOIN)
如果计划数据和实际数据分别存在两张独立表中(比如planned_work和actual_work),我们可以先分别对两张表按craft分组计算成本,再通过FULL JOIN关联结果,确保所有craft都被覆盖(哪怕只有计划或只有实际数据):
SELECT COALESCE(p.craft, a.craft) AS craft, NVL(p.planned_cost, 0) AS planned_cost, -- 用NVL把空值转成0,结果更直观 NVL(a.actual_cost, 0) AS actual_cost FROM -- 计算计划成本的子查询 (SELECT craft, SUM(hr * rate) AS planned_cost FROM planned_work GROUP BY craft) p FULL JOIN -- 计算实际成本的子查询 (SELECT craft, SUM(hr * rate) AS actual_cost FROM actual_work GROUP BY craft) a ON p.craft = a.craft ORDER BY craft;
关键说明:
COALESCE用来取两个子查询中存在的craft值,避免出现NULL;FULL JOIN确保不会遗漏任何只有计划或只有实际数据的craft;- 如果你的表字段名不同(比如计划表用
planned_hr/planned_rate),只需要把SUM(hr * rate)改成对应字段的计算即可。
方法2:UNION ALL + 条件聚合
如果两张表结构相似,也可以先把两张表的数据合并,再通过条件聚合一次性计算两个成本值,写法更简洁:
SELECT craft, SUM(CASE WHEN data_type = 'PLANNED' THEN hr * rate ELSE 0 END) AS planned_cost, SUM(CASE WHEN data_type = 'ACTUAL' THEN hr * rate ELSE 0 END) AS actual_cost FROM (SELECT craft, hr, rate, 'PLANNED' AS data_type FROM planned_work UNION ALL SELECT craft, hr, rate, 'ACTUAL' AS data_type FROM actual_work) combined_data GROUP BY craft ORDER BY craft;
关键说明:
UNION ALL把计划和实际数据合并成一个数据集,并用data_type标记数据来源;CASE WHEN配合SUM实现按数据类型分别累加成本,一步完成分组计算。
内容的提问来源于stack exchange,提问作者Nisha Verma
相关产品推荐
相关产品推荐

