2017-05-20 3 views
2

私はこのようなテーブルがあります。同じクエリで2つの異なるものを数えることはできますか?

// question_and_answers 
+----+---------+---------------+--------+------+ 
| id | title |  body  | amount | type | 
+----+---------+---------------+--------+------+ 
| 1 | t1  | b1   | NULL | 0 | 
| 2 | t2  | b2   | NULL | 1 | 
| 3 | t3  | b3   | NULL | 1 | 
| 4 | t4  | b4   | 100 | 0 | 
| 5 | t5  | b5   | NULL | 0 | 
| 6 | t6  | b6   | NULL | 1 | 
| 7 | t7  | b7   | 50  | 0 | 
+----+---------+---------------+--------+------+ 

をそして、私は2つのクエリがあります。

1:質問の数:

SELECT count(1) FROM question_and_answers WHERE type = 0 

2:支払った質問の数:

SELECT count(1) FROM question_and_answers WHERE type = 0 AND amount IS NOT NULL 

これらの2つのクエリを組み合わせることはできますか?私はそれらの代わりに1つのクエリを書くことができますか?

答えて

3

あなたは条件付き集計使用することができます:MySQLでは比較ですの結果を

SELECT sum(type = 0 AND amount IS NOT NULL), 
     count(*) 
FROM question_and_answers 
WHERE type = 0 

0または1です。上記のクエリのように結果を合計することができます。

それはあなたがこの一般的なANSI SQLのアプローチを使用することができ、他のDBエンジンに動作させるために:

SELECT sum(case when type = 0 AND amount IS NOT NULL then 1 else 0 end), 
     count(*) 
FROM question_and_answers 
WHERE type = 0 

またはcount()と:

SELECT count(case when type = 0 AND amount IS NOT NULL then 1 else null end), 
     count(*) 
FROM question_and_answers 
WHERE type = 0 
+0

ありがとう、upvote。ちょうど 'sum()'の理由なぜカウントしないのですか?私はちょうど何かを集計するのではなく、行の数を数えたいからです。 –

+1

条件 'where type = 0'を追加します。結果を変更することはありませんが、パフォーマンスを向上させることができます。 –

+0

count()も同様に使用できますが、countは何であるかに関わらずnull以外の値をすべてカウントします。したがって、 'sum(type = 0の場合は1 else else end)' –

1

あなたは打撃のクエリを使用することができます。

select count(1) as count1 , sum(if(amount is not null,1,0)) as count2 from question_and_answers where type=0 

カウント1カウント(ty pe = 0)、 count2(タイプ= 0で金額がヌルでない) SQL Serverを使用する場合は、クエリでIFの代わりにIIFを使用します。

+0

ありがとう... upvote –

関連する問題