Вы можете группировать по выражению декодирования или регистру. Пробовал только в Oracle, поэтому не уверен, что это переносимо. С этими данными:
create table t42 as
select 1 id, to_date('01/01/2010') date1, null date2, 'A' status from dual
union select 2, to_date('04/04/2010'), to_date('05/14/2010'), 'X' from dual
union select 3, to_date('01/01/2010'), null, 'A' from dual
union select 4, to_date('01/11/2010'), to_date('01/01/2010'), 'X' from dual
union select 5, to_date('01/02/2010'), null, 'A' from dual
/
select * from t42;
ID DATE1 DATE2 STATUS
---------------------- ------------------------- ------------------------- ------
1 01/01/2010 A
2 04/04/2010 05/14/2010 X
3 01/01/2010 A
4 01/11/2010 01/01/2010 X
5 01/02/2010 A
Вы можете сделать:
select case when date2 is null and status = 'A' then date1
else date2 end as "Date",
sum(case when status = 'A' then 1 else 0 end) as "Number of A status",
sum(case when date2 is null then 0 else 1 end) as "Number of Date 2 null"
from t42
group by case when date2 is null and status = 'A' then date1 else date2 end
order by 1;
Что дает:
Date Number of A status Number of Date 2 null
------------------------- ---------------------- ----------------------
01/01/2010 2 1
01/02/2010 1 0
05/14/2010 0 1