2017-03-31 72 views
0

POSTGRES 9.4:我需要在WHERE上放一個「if」函數,但我知道的唯一方法是SUM CASE WHEN函數。由於您無法在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

你想'HAVING',而不是'WHERE'? – Ryan

+0

或者,如果由於某種原因HAVING不能工作(取決於您的要求),您可以嵌套查詢,並在外部查詢中應用過濾器? – user1327961

+0

您忘記了基本信息以明確問題:查詢應該做什麼?顯示完整的'FROM'子句和你的Postgres版本。 –

回答

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; 
+0

事情是我不想在SELECT上完成每個團隊,但如果這是最好的解決方案,我願意這樣做。問題在於查詢需要很長時間才能執行,因爲表參與者非常大,而且我擔心在SELECT上放置更多的東西會使查詢執行時間更長。 :/ – Erick

+1

答案是基於一個完全不同的問題,所以它不再適合。看起來你完全改變了你的問題,現在是一個關於性能的問題。 –