2017-01-27 5 views
0

私は本当にこのためのexplinationが必要です。あなたは、次の表を持っていると言う:上記の表is_completeSQLカウントケースelse 0対NULL

Columns: 
id int(11) AI PK 
user_id int(11) 
is_complete int(11) 

今すぐ1または0

のいずれかであることができるあなたは、次のSQL文を作成するように、いくつかのカウントを行いたい:

COUNT(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE 0 
END) AS not_complete 

この結果は次のようになります:

(間違っている)3210

は今はまったく同じ文に変更します。

COUNT(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE null 
END) AS not_complete 

注アイブがnull

0を変更すると、次のような結果を得る:

enter image description here

いくつかの徹底的なテストの後、1.不正確なステートメントは何があっても実際にすべてをカウントすることがわかります。

私の質問はなぜですか?

+1

、それはそれはどのように動作するかです。 '0'はヌルではなく、' 1'はヌルではなく、 'NULL'以外のすべての値はカウントされます。 'THEN 1 ELSE 0 END'を使うには' COUNT'の代わりに 'SUM'を使います。 – Lamak

+0

Sum()... – Strawberry

+0

なぜis_complete = 0のテーブルからcount(*)を使わないのですか? – Pirate

答えて

1

CountはNULLを無視しますが、他の値は無視しません。 私はあなたがどこの和を考えると思う:

COUNT(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE null 
END) AS not_complete 

はCOUNT文が値の存在をカウントしているので微妙です

SUM(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE 0 
END) AS not_complete 
1

のようなものです。 NULLを指定すると、その行はCOUNTから削除されます。最初のバージョンはNULLを返しません。したがって、すべての行が含まれます。その結果、カウントは異なります。あなたが経由して、テーブル内のすべての値の要約を行うことができ

:nullではないすべての値をカウントしているので

select is_complete,count(*) 
    from tablename 
group by is_complete