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;
ただし、これで目的が達成されるとは思わないでください。1日以上のエントリがある行全体を表示するかid
(およびsite
、および、どの基準を使用していますか?)、または日付のカウントのみを表示するかは明確ではありません。code
OK、あなたの言いたいことは理解できたと思います...おそらくどのサイトでも、が に対して複数回出現する場合にのみ、日付の数を表示したいですか? これには分析関数を使用できます。CTE を使用して、例として指定したデータを取得します。code
id
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
したがって、内側のクエリでは、 はandの組み合わせdt_count
の個別の日付の数として計算され、組み合わせが出現する回数として計算されます。id
code
code_count_for_id
次に、外側のクエリで、 の値に応じて、またはcase
を表示するかどうかを決定します。dt_count
null
code_count_for_id