You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:48:10