如何通过单条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
相关产品推荐
相关产品推荐

