2017-03-31 9 views
0

POSTGRES 9.4: "if"関数をWHEREに置く必要がありますが、私が知っている唯一の方法はSUMのCASE WHEN関数です。集計関数はWHEREでは使用できないため、機能しません。誰もそうする方法を知っていますか? (以下のクエリは私に与えられた答えに起因して編集されているが、それでも実行するために永遠に取っている誰も私を助けることができます。?)WHEREにSUM(CASE WHEN ...)が含まれています

マイクエリ:

SELECT companies.id 
    , avg(char_length(field_answers.comment)) 
    , count(distinct(field_answers.id)) 
    , count(distinct(surveys.id)) 


FROM contracts 
JOIN companies on contracts.company_id = companies.id 
JOIN surveys on companies.id = surveys.company_id 
JOIN fields on surveys.id = fields.owner_id 
JOIN field_answers on fields.id = field_answers.field_id 
JOIN participants on surveys.id = participants.survey_id 

WHERE fields.owner_type = 'Survey' 
AND surveys.stage in ('finished', 'closed', 'active') 

GROUP BY companies.id 

HAVING sum(case when participants.finished = 'true' then 1 else 0 end) > 0.9 * count(participants.id) 
+1

その後は、多少のようにそれを行うだろうか? – Ryan

+0

また、何らかの理由でHAVINGが動作しない場合(要件に応じて)、クエリをネストすることができます。また、アウトタクエリでフィルタを適用できますか? – user1327961

+0

質問を明確にするための基本的な情報を忘れてしまった:クエリーは何をすべきか?完全な 'FROM'句とあなたのバージョンのPostgresを表示してください。 –

答えて

0

あなたはこのように処理するためのウィンドウ関数を使用します。

sumcountのグループ化について教えてください。ただし、teamという属性で集計するとします。あなたが代わりに `WHERE`の` HAVING`をしたい

SELECT id, name 
FROM (SELECT id, 
      name, 
      sum(finished::integer) OVER (PARTITION BY team) finished_per_team, 
      count(1) OVER (PARTITION BY team) team_size 
     FROM participants 
    ) part_with_stats 
WHERE finished_per_team > 0.9 * team_size; 
+0

問題は、SELECTでチームごとに終了したくないということです。しかし、それが最良の解決策であれば、私はそうするためにオープンしています。問題は、テーブル参加者が本当に大きいためにクエリの実行に時間がかかり、SELECTにもっと多くのものを置くとクエリの実行に時間がかかることです。 :/ – Erick

+1

答えはまったく異なる質問に基づいているため、それ以上は適合しません。あなたの質問を完全に変更したように思えますし、今はパフォーマンスに関する質問です。 –