2012-07-05 10 views
5

は、ただ非常に簡単な例として、のは、私はそうのようなサンプルデータを持つテーブルtestを持っているとしましょう:条件付きカウント:SUM()とCOUNT()を使用した場合のパフォーマンスの差異?

a  |  b  
------------- 
1  | 18 
1  | 24 
1  | 64 
1  | 82 
1  | 10 
1  |  7 
2  |  5 
2  | 18 
2  | 66 
2  | 72 
3  | 81 
3  | 97 

そして、それぞれのaについて、私はそこにあるどのように多くのbさんのカウントを取得しますよ今私は2つの方法のいずれかで、この結果を達成でき

a  | bcnt 
-------------- 
1  |  4 
2  |  2 
3  |  0 

:< 50.結果は次のようになり

SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt 
FROM test 
GROUP BY a 

または:

SELECT a, SUM(CASE WHEN b < 50 THEN 1 ELSE 0 END) AS bcnt 
FROM test 
GROUP BY a 

私はこれを知っているが、このような些細な些細な問題のように見えるかもしれませんが、私の質問には、任意の利点(ただしので、わずかなが)という点で他の上で1つのアプローチを使用することにあるだろうされています。パフォーマンス? ...どのくらい多くのDBMSが働いていますか... ...文の明瞭性... ...等

+3

"私は**カウント**を取得したい..."と答えることは尋ねることですか? :-) – Eric

答えて

7

パフォーマンスは?

ああ、違いは、もしあれば、限界があると思います。私が心配することは何もないだろう。

他にもDBMSはいくつありますか?

私は両方とも、少なくとも、そう、再び、これはとにかくない私には、気にならない任意の主要 SQL製品に働くだろう疑いをしました。

陳述の透明性?

確かCOUNTいくつかの任意の値を追加することではない、あなたがものにしたいという明確それを表現します。 SUMでは、条件をスキミングした後でTHEN 1部分に到達したときにのみ、実際の意図を認識します。

また、COUNTを使用すると、ELSEが存在しない場合に暗示されるため、ELSE NULLの部分を省略することができます。SUMの式でELSE 0を省略すると、おそらく予想される0の代わりにNULLの結果になることがあります。一方

カウントの結果としてNULL代わりに0を返すことがより便利であろう全く逆の状況が存在してもよいです。だから、私がCOUNTを使用した場合、SUM(CASE ...)ELSE句を除外するだけで十分ですが、NULLIF(COUNT(CASE ...), 0)のような何かをしなければならないでしょう。しかし、そのような場合でさえ、やや明瞭な簡潔さ(他のものは等しい)よりも幾分長い明快さを好むかもしれません。

-1

COUNTを使用すると、要素を数えます。SUMを使用して、数値を(正、負またはゼロ)結果は否定的である可能性があります。句いただきまし間違ったと

2

:個人的に

select a, count(b) 
from test 
where b < 50 
group by a 
+0

Eh?集計関数のフィルタ結果を得ることです。どこを意味するの? – podiluska

+0

@PaddyはORA-00979を与えるでしょう:GROUP BYの式ではありません... – beny23

+0

申し訳ありませんが、あなたは正しく編集します。 – Paddy

3

、私は

select a, count(b) 
    from test 
where b < 50 
group by a 

クリア、簡潔でほんの少し速く他の人よりも、このSQL fiddleに応じて使用しますが(応じて以下のデータを必要とします小さなテーブルでは違いを気付かないでしょう):