1

などの可能性bugのある列を持つテーブルなど、単純なケースを想定します。 未解決のバグの数を知りたい場合は 、次のようにします。statusopenfixed

select count(*) as open_bugs from bugs where status = 'open';

開いているバグの数を知りたい場合は、次のようにします。

select count(*) as closed_bugs from bugs where status = 'closed';

結果を 2 列で返すクエリで、開いている数と閉じている数を知りたい場合、つまり

Open | Closed|  
  60    180   

それを行う最良の方法は何ですか?UNION結果を連結するので、私が望むものではありません

4

3 に答える 3

7

テーブル全体で集計するバリアント以外にも、CASE別の方法があります。あなたが持っているクエリを使用して別の中に入れるにはSELECT

SELECT 
  ( SELECT COUNT(*) FROM bugs WHERE status = 'open')   AS open_bugs, 
  ( SELECT COUNT(*) FROM bugs WHERE status = 'closed') AS closed_bugs 
FROM dual      -- this line is optional 
 ; 

単一のクエリで異なるテーブルまたは結合からのカウントをラップできるという利点があります。

効率にも違いがあるかもしれません (悪いか良いか)。テーブルとインデックスでテストします。

を使用GROUP BYして、すべてのカウントを別々の行に取得し (UNION言及したように)、別の集計を使用して結果を 1 行にピボットすることもできます。

SELECT 
  MIN(CASE WHEN status = 'open'   THEN cnt END) AS open_bugs, 
  MIN(CASE WHEN status = 'closed' THEN cnt END) AS closed_bugs
FROM 
  ( SELECT status, COUNT(*) AS cnt
    FROM bugs 
    WHERE status IN ('open', 'closed')
    GROUP BY status 
  ) AS g
于 2013-06-19T20:34:06.317 に答える
4

これを試して

select count(case when status = 'open' then 1 end) open_bugs,
count(case when status = 'closed' then 1 end) closed_bugs
from bugs
于 2013-06-19T20:21:57.157 に答える