Вот один из подходов:
select t.type as "Type"
, sum(case when t.status = 'A' then 1 else 0 end) as "Count A"
, sum(case when t.status = 'I' then 1 else 0 end) as "Count I"
, sum(case when t.status = 'F' then 1 else 0 end) as "Count F"
from my_table t
group by t.type
order by t.type desc
Это работает, если у вас есть определенные столбцы, которые вы хотите вернуть, и работает для «подсчета» строк, которые соответствуют более сложному набору критериев.
[EDIT]
(Добавлено ключевое слово DESC, чтобы упорядочить набор результатов, как показано на OP, +1 хороший уловок Роба ван Вейка!)
(Andomar делает хорошее наблюдение, имея все больше и больше столбцов в наборе результатов, используя этот подход, утверждение становится непригодным. Существуют другие подходы к получению того же набора результатов, которые работают хорошо, если единственным «тестом» является сравнение на равенство в одном столбце.)
Oracle 8i поддерживает выражение CASE, не так ли? Oracle 8 не, если я правильно помню. Мы можем перейти к «старой школе», чтобы сделать то же самое с функцией DECODE:
select t.type as "Type"
, sum(decode(t.status,'A',1,0)) as "Count A"
, sum(decode(t.status,'I',1,0)) as "Count I"
, sum(decode(t.status,'F',1,0)) as "Count F"
from my_table t
group by t.type
order by t.type DESC
[/ EDIT]
Иногда мы хотим проверить более одного условия типа и включить строку в несколько подсчетов. Мы можем получить всего
select t.type as "Type"
, sum(case when t.status in ('A') then 1 else 0 end) as "Count A"
, sum(case when t.status in ('I') then 1 else 0 end) as "Count I"
, sum(case when t.status in ('F') then 1 else 0 end) as "Count F"
, sum(case when t.status in ('A','I') then 1 else 0 end) as "#AI"
, sum(decode(sign(t.foo-t.bar),1,1,0)) as "#foo>bar"
, sum(decode(sign(10.0-t.foo),1,1,0)) as "#foo<10"
from my_table t
group by t.type
order by t.type desc
(Следует отметить, что строка может удовлетворять заданным критериям для нескольких столбцов, и поэтому ее можно «подсчитать» более одного раза. Иногда это именно то, что нам нужно.)