2010-11-18 13 views
2

J'essaie de faire des agrégations dans l'instruction case. J'ai trouvé 2 façons de le faire. Quelqu'un peut-il dire quelle est la différence entre les 2?agrégations dans l'instruction

  1. (CASE WHEN Event = 5 THEN count(*) ELSE 0 END) Follow_Count GROUP BY Event;

  2. SUM(CASE Event WHEN 5 THEN 1 ELSE 0 END) AS Follow_Count

Répondre

2

Il n'y a pas de différence significative. Vous pouvez décider pour vous de ce qui est le mieux en comparant leurs plans d'exécution.

3

Il serait mieux:

count(CASE Event WHEN 5 THEN 1 END) AS Follow_Count 

Parce que 1) pour le comptage utilisé propre compteur standart, 2) "else" pas besoin (compter ne comptent pas les valeurs NULL)

Cordialement, Sayan M.

+0

En outre, votre première variante pour le groupe par preferrable seul événement, et la deuxième plus souple et pourrait utilisé dans de nombreuses variantes, et avec des fonctions analytiques –

+0

Vous pouvez également le faire avec le décodage plutôt que le boîtier. count (decode (Event, 5,1)) Comme Follow_Count –

+0

Je sais, mais c'est égal (sauf les valeurs nulles, qui ne sont pas utilisées en condition). J'ai donc décidé de laisser le cas tel quel. –

5

Votre cas 1 produira une ligne pour chaque événement de la table (de votre groupe par). Votre cas 2 retournera juste 1 rangée.

Y at-il une raison que vous ne suffit d'écrire:

select count(*) 
from my_table 
where event = 5;