2009-06-03 9 views
1

J'ai une table qui ressemble à quelque chose comme ceci:Oracle 8i Recherche Aide

 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 

Quelqu'un peut-il me aider à trouver une requête pour 8i oracle qui affiche ce tableau comme celui-ci

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

Merci !

Répondre

6

est ici une approche:

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 

Cela fonctionne si vous avez des colonnes spécifiques que vous souhaitez renvoyer, et travaille pour « comptage » lignes qui répondent à des critères plus complexes fixés.

[EDIT]

(Ajouté le mot-clé DESC pour obtenir le jeu de résultats commandé comme le montre OP, +1 bonne prise par Rob van Wijk!)

(Andomar fait une bonne observation, avec plus Il existe d'autres approches pour obtenir le même jeu de résultats qui fonctionne bien si le seul "test" est une comparaison d'égalité sur une seule colonne.)

Oracle 8i supporte l'expression CASE, n'est-ce pas? Oracle 8 n'a pas, si je me souviens bien. On peut aller « vieille école » pour faire la même chose avec la fonction 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]

, nous voulons parfois vérifier plus d'une condition de type, et comprennent une rangée plus plus d'un compte. Nous pouvons obtenir un total

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 

(Juste pour signaler, il est possible pour une ligne de satisfaire aux critères spécifiés pour plusieurs colonnes, et il pourrait donc être « compté » plus d'une fois. Parfois, c'est exactement ce que nous vouloir.)

+0

+1 Bien que cela se briserait s'il y avait plus de 100 statuts différents :) – Andomar

+1

+1 Bonne vieille solution pivotante. Seule la commande aurait dû descendre :-) –

+0

Merci spencer! Cela fonctionne parfaitement! – zSynopsis