2017-03-31 15 views
0

POSTGRES 9.4: Ich muss eine "if" -Funktion auf WHERE setzen, aber die einzige Weise, die ich weiß, ist ein CASE WHEN Funktion SUMME. Da Sie Aggregatfunktionen in WHERE nicht verwenden können, funktioniert es nicht. Kennt jemand einen Weg, dies zu tun? (Die Abfrage unten wurde wegen mir gegeben auf die Antworten bearbeitet, aber immer noch nimmt immer auszuführen mir jemand helfen kann.?)Äquivalent zu SUMME (CASE WHEN ...) in WO

Meine Frage:

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

Sie wollen 'HAVING' statt' WHERE'? – Ryan

+0

Oder, wenn HAVING aus irgendeinem Grund nicht funktionieren würde (abhängig von Ihren Anforderungen) können Sie die Abfrage verschachteln und in der äußeren Abfrage wenden Sie den Filter an? – user1327961

+0

Sie haben grundlegende Informationen vergessen, um die Frage zu klären: Was soll die Abfrage tun? Zeigen Sie die vollständige FROM-Klausel und Ihre Version von Postgres. –

Antwort

0

Sie Windows-Funktionen für die Verarbeitung wie folgt aus .

Sie haben vergessen zu sagen, was die Gruppierung für die sum und count ist, aber nehmen wir an, dass Sie nach dem Attribut team aggregieren möchten.

Dann würden Sie es tun etwas wie folgt aus:

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

Die Sache ist, dass ich nicht möchte, dass jedes Team auf der SELECT beendet wird, aber wenn es die beste Lösung ist, bin ich offen dafür. Die Sache ist, dass die Abfrage sehr lange dauert, weil die Teilnehmer der Tabelle wirklich groß sind, und ich befürchte, dass die Ausführung der Abfrage länger dauert, wenn mehr Dinge auf SELECT gesetzt werden. :/ – Erick

+1

Die Antwort basierte auf einer ganz anderen Frage, also passt sie nicht mehr. Es sieht so aus als ob du deine Frage komplett geändert hast und es ist jetzt eine Frage der Leistung. –