您不能在where
计算它的查询的子句中引用聚合;但这就是该having
条款的用途:
SELECT id, site, code,
(select count(distinct date)
from table b
where code = 'A' and b.id = a.id
having count(distinct date) > 2) subquery
from table a;
但是不要认为这会得到你想要的。目前尚不清楚您是否要显示包含超过一天的条目的任何id
(和site
,和?您使用什么标准?)的整行,或者只是日期的计数。code
好的,我想我已经明白你的意思了......你只想显示日期的数量,如果acode
出现不止一次 a id
,大概在任何网站上?您可以为此使用分析函数;使用 CTE 获取您提供的数据作为示例:
with t as (
select 1 as id, '01' as site, 'A' as code, date '2012-08-20' dt from dual
union all select 2, '01', 'A', date '2012-08-21' from dual
union all select 1, '01', 'A', date '2012-08-20' from dual
)
SELECT distinct id, site, code,
case when code_count_for_id > 1 then dt_count else null end as dates
FROM (
SELECT id, site, code, dt,
count(distinct dt) over (partition by id, code) dt_count,
count(*) over (partition by id, code) as code_count_for_id
FROM t
)
ORDER BY id, code;
ID SI C DATES
---------- -- - ----------
1 01 A 1
2 01 A
因此,在内部查询中,dt_count
计算为id
andcode
组合的不同日期数,并code_count_for_id
计算为该组合出现的次数。
然后在外部查询中case
决定是显示dt_count
还是null
取决于code_count_for_id
.