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

如何通过单条SQL实现两个无关联表的统计结果相除运算

跨无关联表查询统计并计算单工单平均耗时的SQL实现方案

核心思路:两个表的统计结果都是单行单列的聚合值,不需要关联字段即可直接合并计算,以下是两种通用实现方案:


方案1:直接嵌套子查询(兼容绝大多数SQL方言)

直接将两个聚合查询作为子查询放在SELECT语句中,语法简洁:

SELECT 
  a AS 已完成工单数,
  total_duration AS 总处理耗时(小时),
  -- 执行除法运算,得到单工单平均耗时
  total_duration / a AS 单工单平均耗时(小时)
FROM 
  (SELECT Count(DISTINCT case_id) AS a FROM booker) t1,
  (SELECT sum(TO_NUMBER(LEFT(duration, 2),'99D999') + TO_NUMBER(SUBSTRING(duration, 3,3),'99D999') / 60 + TO_NUMBER(RIGHT(duration, 2),'99D999') / 3600) AS total_duration FROM time_ad) t2;

代入你给出的测试数据,运算结果为 12234 / 120 = 101.95 小时/工单。


方案2:CTE写法(可读性更高,适合后续扩展逻辑)

如果后续需要添加更多统计维度,用公共表表达式拆分逻辑更易维护:

WITH 
-- 统计工单数
t1 AS (SELECT Count(DISTINCT case_id) AS a FROM booker),
-- 统计总耗时
t2 AS (SELECT sum(TO_NUMBER(LEFT(duration, 2),'99D999') + TO_NUMBER(SUBSTRING(duration, 3,3),'99D999') / 60 + TO_NUMBER(RIGHT(duration, 2),'99D999') / 3600) AS total_duration FROM time_ad)
SELECT 
  a AS 已完成工单数,
  total_duration AS 总处理耗时(小时),
  -- 增加除零容错,避免工单数量为0时SQL报错
  CASE WHEN a > 0 THEN total_duration / a ELSE 0 END AS 单工单平均耗时(小时)
FROM t1, t2;

注意事项

  • 如果你使用的不是Oracle/PostgreSQL等支持TO_NUMBER的数据库,需要将时间转换逻辑替换为对应数据库的函数(比如MySQL用TIME_TO_SEC直接转换时间格式再除以3600即可,逻辑更简洁)
  • 建议保留除零判断逻辑,避免工单数量为0时触发数据库运算错误

内容的提问来源于stack exchange,提问作者nynek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:06:03