Справка по Oracle 8i Query - PullRequest
       11

Справка по Oracle 8i Query

1 голос
/ 04 июня 2009

У меня есть таблица, которая выглядит примерно так:

     ID    |     STATUS    |     TYPE
----------------------------------------
x123       |      A        | High School
x122       |      I        | High School
x124       |      F        | High School
x125       |      A        | College
x126       |      I        | College
x127       |      F        | College
x128       |      F        | College

Может кто-нибудь помочь мне придумать запрос для Oracle 8i, который отображает эту таблицу следующим образом

Type             |    Count A    |    Count I    |  Count F
------------------------------------------------------------
High School      |     1         |     1         |  1
College          |     1         |     1         |  2

Спасибо!

1 Ответ

6 голосов
/ 04 июня 2009

Вот один из подходов:

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

(Следует отметить, что строка может удовлетворять заданным критериям для нескольких столбцов, и поэтому ее можно «подсчитать» более одного раза. Иногда это именно то, что нам нужно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...