Oracle:基于关联表的区间条件统计实现
解决区间统计需求的SQL实现
刚好帮你搞定这个统计需求!我来一步步拆解怎么实现~
先明确表结构(方便演示)
先假设两个表的名称分别为range_table(存储范围规则)和value_table(存储待统计的值),先创建并插入测试数据:
-- 创建范围表 CREATE TABLE range_table ( COL_A VARCHAR(2), FROM INT, TO INT ); INSERT INTO range_table VALUES ('D1', 1, 3), ('D2', 3, 7); -- 创建值表 CREATE TABLE value_table ( COL_A VARCHAR(2), VALUE INT ); INSERT INTO value_table VALUES ('D1', 0), ('D1', 2), ('D1', 5), ('D2', 2), ('D2', 5), ('D2', 6);
核心查询语句
通过LEFT JOIN关联两个表,结合条件计数来分别统计三个区间的记录数:
SELECT rt.COL_A, rt.FROM, rt.TO, -- 统计VALUE小于FROM的数量 COUNT(CASE WHEN vt.VALUE < rt.FROM THEN 1 END) AS LESS_THAN_FROM, -- 统计VALUE介于FROM和TO之间(包含边界)的数量 COUNT(CASE WHEN vt.VALUE >= rt.FROM AND vt.VALUE <= rt.TO THEN 1 END) AS BETWEEN_FROM_TO, -- 统计VALUE大于TO的数量 COUNT(CASE WHEN vt.VALUE > rt.TO THEN 1 END) AS GREATER_THAN_TO FROM range_table rt -- 用LEFT JOIN保证范围表的每一行都能出现在结果中 LEFT JOIN value_table vt ON rt.COL_A = vt.COL_A -- 按范围表的每一行分组统计 GROUP BY rt.COL_A, rt.FROM, rt.TO ORDER BY rt.COL_A;
查询结果
执行后会得到你需要的统计结果:
| COL_A | FROM | TO | LESS_THAN_FROM | BETWEEN_FROM_TO | GREATER_THAN_TO |
|---|---|---|---|---|---|
| D1 | 1 | 3 | 1 | 1 | 1 |
| D2 | 3 | 7 | 1 | 2 | 0 |
关键逻辑说明
LEFT JOIN:确保即使value_table中没有对应COL_A的记录,range_table的行也会被保留,此时三个计数都会是0COUNT(CASE ...):利用CASE表达式筛选符合区间的记录,满足条件返回1,不满足返回NULL;而COUNT函数会忽略NULL值,从而得到对应区间的有效记录数GROUP BY:必须包含range_table的所有非聚合列(COL_A、FROM、TO),确保按每一条范围规则单独统计
内容的提问来源于stack exchange,提问作者banana_99
相关产品推荐
相关产品推荐

