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)
答案 0 :(得分:0)
您可以使用Windows函数进行此类处理。
您忘了告诉我们sum
和count
的分组是什么,但我们假设您希望按属性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;