oracle 如何使用没有group by函数的计数?

ix0qys7i  于 2023-03-17  发布在  Oracle
关注(0)|答案(2)|浏览(279)

我需要使用一个case语句来计算结果,以确定输出的内容。
我想写的是当a_code返回多于1个值时输出'n/a'否则输出a_code。
我是这么试的

select
case when COUNT(a_code) > 1 then 'n/a' else a_code end
from 
table_name
where b_code = 'abc';

ORA-00937上的错误:不是一个单组group函数我知道这个错误是因为没有group by。
我的问题是像这样添加组

select
case when COUNT(a_code) > 1 then 'n/a' else a_code end
from 
table_name
where b_code = 'abc'
group by a_code;

它不计算返回的a_code总数并确定是"n/a“还是打印a_code,而是计算重复的a_codes,如果有重复的a_codes,则打印”n/a“。
你知道我该怎么写这个查询吗?

6l7fqoea

6l7fqoea1#

可以使用解析COUNT函数(而不是聚合函数):

select case
       when COUNT(a_code) OVER () > 1
       then 'n/a'
       else a_code
       end AS a_code
from   table_name
where  b_code = 'abc';

其中,对于示例数据:

CREATE TABLE table_name (a_code, b_code) AS
SELECT 'aaa', 'abc' FROM DUAL UNION ALL
SELECT 'aaa', 'abc' FROM DUAL;

输出:
| A_代码|
| - ------|
| 不适用|
| 不适用|
fiddle

gr8qqesn

gr8qqesn2#

一些样本数据和预期结果将有所帮助;同时看看这是否合理。
对于这样的示例数据,首先计算您感兴趣的行数,然后在final select中使用该值:

SQL> with table_name(a_code, b_code) as
  2    (select '1', 'abc' from dual union all
  3     select '2', 'abc' from dual union all
  4     select '3', 'def' from dual
  5    ),
  6  temp as
  7    (select count(*) cnt
  8     from table_name
  9     where b_code = 'abc'
 10    )
 11  select a.a_code, a.b_code, t.cnt,
 12    case when t.cnt > 1 then 'n/a' else a.a_code end result
 13  from table_name a cross join temp t;

A_CODE  B_CODE           CNT RESULT
------- ------- ------------ -------
1       abc                2 n/a
2       abc                2 n/a
3       def                2 n/a

SQL>

如果没有至少两个abc

SQL> with table_name(a_code, b_code) as
  2    (select '1', 'abc' from dual union all
  3     select '2', 'abx' from dual union all   --> was 'abc' before
  4     select '3', 'def' from dual
  5    ),
  6  temp as
  7    (select count(*) cnt
  8     from table_name
  9     where b_code = 'abc'
 10    )
 11  select a.a_code, a.b_code, t.cnt,
 12    case when t.cnt > 1 then 'n/a' else a.a_code end result
 13  from table_name a cross join temp t;

A_CODE  B_CODE           CNT RESULT
------- ------- ------------ -------
3       def                1 3
2       abx                1 2
1       abc                1 1

SQL>

相关问题