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

Oracle SQL中如何通过单查询按IN子句多值分别统计行数?

解决Oracle SQL中单个查询统计多个ID各自匹配行数的方法

方法1:基础分组统计(仅返回有匹配的ID)

直接通过GROUP BY按ID分组,搭配COUNT(*)统计每个ID的匹配行数,适合不需要显示无匹配ID的场景:

SELECT
    ID,
    COUNT(*) AS 匹配行数
FROM TABLE_NAME
WHERE ID IN ('A22', 'B22', 'C22', 'D22')
GROUP BY ID;

执行后会返回每一个在表中有匹配数据的ID及其对应行数,无匹配的ID不会出现在结果集中。

方法2:强制显示所有目标ID(含无匹配的0值)

如果需要确保所有指定的ID都出现在结果里,哪怕没有匹配数据也显示0,可以先构造包含所有目标ID的临时数据集,再通过左连接统计:

WITH target_ids AS (
    SELECT 'A22' AS ID FROM DUAL
    UNION ALL SELECT 'B22' FROM DUAL
    UNION ALL SELECT 'C22' FROM DUAL
    UNION ALL SELECT 'D22' FROM DUAL
)
SELECT
    t.ID,
    COUNT(tn.ID) AS 匹配行数
FROM target_ids t
LEFT JOIN TABLE_NAME tn ON t.ID = tn.ID
GROUP BY t.ID;

这里用WITH子句生成临时的目标ID集合,左连接原表后统计,无匹配的ID会显示0。

方法3:转成列格式展示(一行显示所有结果)

如果希望结果以横向列的形式展示每个ID的计数,可以使用PIVOT操作:

SELECT
    NVL(A22_COUNT, 0) AS A22计数,
    NVL(B22_COUNT, 0) AS B22计数,
    NVL(C22_COUNT, 0) AS C22计数,
    NVL(D22_COUNT, 0) AS D22计数
FROM (
    SELECT ID FROM TABLE_NAME WHERE ID IN ('A22', 'B22', 'C22', 'D22')
)
PIVOT (
    COUNT(ID) FOR ID IN ('A22' AS A22_COUNT, 'B22' AS B22_COUNT, 'C22' AS C22_COUNT, 'D22' AS D22_COUNT)
);

执行后会返回一行数据,每个ID对应一个列显示计数,用NVL可以把无匹配的NULL转成0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:21:13