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
相关产品推荐
相关产品推荐

