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

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_AFROMTOLESS_THAN_FROMBETWEEN_FROM_TOGREATER_THAN_TO
D113111
D237120

关键逻辑说明

  • LEFT JOIN:确保即使value_table中没有对应COL_A的记录,range_table的行也会被保留,此时三个计数都会是0
  • COUNT(CASE ...):利用CASE表达式筛选符合区间的记录,满足条件返回1,不满足返回NULL;而COUNT函数会忽略NULL值,从而得到对应区间的有效记录数
  • GROUP BY:必须包含range_table的所有非聚合列(COL_A、FROM、TO),确保按每一条范围规则单独统计

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:07:41