Oracle带GROUP BY的COUNT查询无数据返回空行,需返回cnt=0
Oracle查询:无匹配数据时返回含指定列和cnt=0的结果
可以通过以下几种方式实现,同时保留GROUP BY子句和SELECT中的cnt、record_no列:
方法一:利用DUAL表构造基准行,结合LEFT JOIN统计
通过DUAL生成包含目标location#的基准行,再左关联原表进行统计。即使原表无匹配数据,基准行也会被保留,统计值自动为0:
SELECT COUNT(t.location#) AS cnt, 83 AS record_no FROM DUAL LEFT JOIN test t ON t.cny# = 1 AND t.location# = 83 GROUP BY 83;
- 原理:
DUAL表始终返回一行,LEFT JOIN确保即使test中无符合条件的数据,也会保留这一行;COUNT(t.location#)会忽略NULL值,因此无匹配时返回0。
方法二:用UNION ALL补全默认行,再聚合统计
先通过UNION ALL将目标location#的默认行与原表查询结果合并,再进行分组统计:
SELECT COUNT(CASE WHEN cny# = 1 AND location# = 83 THEN 1 END) AS cnt, location# AS record_no FROM ( -- 查询原表中符合条件的数据 SELECT location#, cny# FROM test WHERE cny# = 1 AND location# = 83 -- 补全默认行,确保无匹配时仍有数据 UNION ALL SELECT 83, 1 FROM DUAL ) GROUP BY location#;
- 原理:当原表无匹配数据时,子查询仅返回默认行;
COUNT(CASE...)只统计符合条件的记录,因此返回0。
方法三:使用聚合函数结合固定分组值
直接基于固定的location#值分组,通过条件聚合统计匹配数量:
SELECT SUM(CASE WHEN cny# = 1 AND location# = 83 THEN 1 ELSE 0 END) AS cnt, 83 AS record_no FROM test GROUP BY 83;
- 原理:
SUM(CASE...)会遍历全表统计符合条件的记录数,无匹配时返回0;GROUP BY 83确保返回一行结果,即使原表为空。
内容的提问来源于stack exchange,提问作者shashikant kuswaha
相关产品推荐
相关产品推荐

