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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:21:46