2016-08-29 13 views
2

私のテーブルに次のデータがあるとします。SQLのGROUP BY句を使用すると、1つのグループで複数の異なる値がカウントされる

テーブル名:タスク

+---------+ 
| status | 
+---------+ 
| open | 
| reopen | 
| reopen | 
| close | 
| suspend | 
| close | 
+---------+ 

今、私はその状態でレコード・グループをカウントします。 しかし、1つの変更点があります。を開きますは同じグループのように再オープンします。

私はこの以下のクエリを実行します。

SELECT 
status,COUNT(*) 
FROM 
Task 
GROUP BY status 

A)私が得たもの。

B)私がしたい。

A)      B) 
+---------+---------+ +---------+---------+ 
| status | count | | status | count | 
+---------+---------+ +---------+---------+ 
| open | 1  | | open | 3  | 
| reopen | 2  | | close | 2  | 
| close | 2  | | suspend | 1  | 
| suspend | 1  | +---------+---------+ 
+---------+---------+ 

上記のA)からわかるように、私はクエリの結果を得ました。 しかし私はそれを開いて再オープンの記録を数えたいと思います。 B)で見ることができます。

もう1つのことは水平方向に数えたくありません。 どちらが試みましたか?以下のクエリが機能します。

C) 
SELECT 
    COUNT(case status when 'open' then 1 when 'reopen' then 1 else null end) as open 
    COUNT(case status when 'close' then 1 else null end) as close, 
    COUNT(case status when 'suspend' then 1 else null end) as suspend 
FROM 
    Task 
+---------+---------+---------+ 
| open | close | suspend | 
+---------+---------+---------+ 
| 3  | 2  | 1  | 
+---------+---------+---------+ 

私の質問です。上記のように、オプションC)を使用せずにB)をどのように達成できますか?

あなたはCだけのやり過ぎである。このsqlfiddle http://sqlfiddle.com/#!9/fdf820

答えて

4

オプションを試すことができます。あなたがする必要があるのは

SELECT CASE status WHEN 'reopen' THEN 'open' ELSE status END, COUNT(*) 
FROM  task 
GROUP BY CASE status WHEN 'reopen' THEN 'open' ELSE status END 
1

@Mureinikへのすべてのありがとうの最初の、そして彼の答え

に従った後、私は必要は投影でCASEを渡さないためにことを発見し、「開く」ために「再度開く」に変換されます。 このクエリも機能します。これはもっと効率的かもしれません。

SELECT status, COUNT(*) 
FROM  task 
GROUP BY CASE status WHEN 'reopen' THEN 'open' ELSE status END 
関連する問題