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

如何在单条SQL语句中统计Oracle表的多条件结果?

Oracle多维度分组统计实现方法

源表结构与数据

现有一张Oracle表,结构及数据如下:

myidstatusownerdate
a001openJohn0901
a001cnclJohn0901
a002openJohn0901
a002openAndy0901
a003openJohn0901
a003openJohn0902
a003openJohn0902

期望统计结果

需要按myid分组得到如下统计:

myidcount(1)count(2)count(3)count(4)
a0012122
a0022012
a0033031

统计项定义

  • count(1):对应myid的总记录数
  • count(2):对应myid中status为'cncl'的记录数
  • count(3):对应myid中owner为'John'的记录数
  • count(4):对应myid中date为'0901'的记录数

实现方案

不用复杂函数,Oracle的条件聚合就能简洁实现需求,结合GROUP BY和CASE WHEN即可完成,效率优异。

写法一:使用COUNT结合CASE WHEN

SELECT
    myid,
    COUNT(*) AS "count(1)",
    COUNT(CASE WHEN status = 'cncl' THEN 1 END) AS "count(2)",
    COUNT(CASE WHEN owner = 'John' THEN 1 END) AS "count(3)",
    COUNT(CASE WHEN date = '0901' THEN 1 END) AS "count(4)"
FROM
    your_table_name -- 替换为实际表名
GROUP BY
    myid
ORDER BY
    myid;

原理:当CASE条件满足时返回1,不满足则返回NULL,COUNT函数会自动忽略NULL值,最终得到符合条件的记录数。

写法二:使用SUM结合CASE WHEN

SELECT
    myid,
    COUNT(*) AS "count(1)",
    SUM(CASE WHEN status = 'cncl' THEN 1 ELSE 0 END) AS "count(2)",
    SUM(CASE WHEN owner = 'John' THEN 1 ELSE 0 END) AS "count(3)",
    SUM(CASE WHEN date = '0901' THEN 1 ELSE 0 END) AS "count(4)"
FROM
    your_table_name -- 替换为实际表名
GROUP BY
    myid
ORDER BY
    myid;

原理:满足条件时累加1,不满足时累加0,求和结果即为目标统计数,和写法一效果完全一致,可根据个人习惯选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:29:52