相当于WHERE中的SUM(CASE WHEN ...)

时间:2017-03-31 20:42:08

标签: postgresql

POSTGRES 9.4:我需要放一个" if"函数在WHERE上,但我知道的唯一方法是SUM一个CASE WHEN函数。由于您无法在WHERE上使用聚合函数,因此它无法正常工作。有谁知道这样做的方法? (由于给出了答案,下面的查询已被编辑,但仍然需要永远执行。任何人都可以帮助我吗?)

我的查询:

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 个答案:

答案 0 :(得分:0)

您可以使用Windows函数进行此类处理。

您忘了告诉我们sumcount的分组是什么,但我们假设您希望按属性team进行汇总。

然后你会这样做:

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;