1つのSELECTステートメントで複数の範囲のカウントを返す


9

fooとりわけ、score0から10の範囲の列を持つPostgresデータベーステーブルがあります。クエリで、スコアの合計数、0から3までのスコアの数、4の間のスコアの数を返します。 6、7から10までのスコアの数。次のようなもの:

SELECT
  COUNT(*) as total,
  COUNT(
    SELECT * from foo where score between 0 and 3;
  ) as low,
  COUNT(
    SELECT * from foo where score between 4 and 6;
  ) as mid,
  COUNT(
    SELECT * from foo where score between 7 and 10;
  ) as high
FROM foo;

私はこれを試しましたSELECTが、COUNTステートメント内でエラーが発生しました。どうすればこれを行うことができますか?Postgresには非常に簡単な方法があると確信しています。Googleにとって正しい用語を理解できません。

回答:


7

SUM()各数値範囲の列ごとに条件ステートメントを使用するだけです。SUM(1)テーブルのすべてのデータが範囲の1つにあると仮定して、を使用するだけで合計を合計できます。そうでない場合は、他のデータと同様に制限します。

select sum(case when score between 0 and 3 then 1 else 0 end) as minrange,
       sum(case when score between 4 and 6 then 1 else 0 end) as midrange,
       sum(case when score between 7 and 10 then 1 else 0 end) as maxrange,
       sum(1) as total
from foo;

SQLフィドルリンク


8

FILTERPostgres 9.4以降の集計句

Postgres 9.4以降、クリーンで高速な(SQL標準)方法があります。

SELECT count(*) FILTER (WHERE score BETWEEN 0 AND 3)  AS low
     , count(*) FILTER (WHERE score BETWEEN 4 AND 7)  AS mid
     , count(*) FILTER (WHERE score BETWEEN 8 AND 10) AS high
     , count(*)                                       AS total
FROM   foo;

totalNULLまたは他の値が関係しない限りlowmidとが加算されhighます。

リンク:

以下もお読みください。

Postgres 9.3-

いくつかのテクニックがあります:

@Philは標準の方法をCASEステートメントで提供しました(ただし、sum(1)は標準の方法ではありません)。短い形式を使用したい:

SELECT count(score BETWEEN 0 AND 3  OR NULL) AS low
     , count(score BETWEEN 4 AND 6  OR NULL) AS mid
     , count(score BETWEEN 7 AND 10 OR NULL) AS high
     , count(*)                              AS total
FROM   foo;

値が質問で定義されているとおりである場合(のみ0- 10可能)、さらに単純化します。

SELECT count(score < 4 OR NULL)             AS low
     , count(score BETWEEN 4 AND 6 OR NULL) AS mid
     , count(score > 6 OR NULL)             AS high
     , count(*)                             AS total
FROM   foo;

少し短く、やや速い。

微妙な違い

Philの回答と比較すると、微妙な違いがありますsum()

  • 最も重要なのは、ドキュメントごとに

    を除いてcount、これらの関数は行が選択されていない場合にnull値を返すことに注意してください。特に、sumどの行も期待どおりのゼロではなくnullを返します...

  • count(*) ある標準的な方法とビットが速くよりsum(1)。この場合も、nullと0が適用されます。

これらのクエリ(フィルのクエリを含む)は、のnull値をカウントしますtotal。それが望ましくない場合は、代わりに使用してください:

count(score) AS total_not_null

9.3の SQL Fiddleここでは、10ページの
db <> fiddle

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.