2016-04-15 18 views
0

Ich bin neu in Oracle DB und ich versuche eine Abfrage zu schreiben, die SUMME von Zeilen zählt, die Feld AWARD zwischen 3 und 4 haben, aber dann muss ich sie durch COUNT() teilen alle Zeilen. Das bedeutet, ich selbst Reihen zählen müssen, wo AWARD = 1,0, -1 usw.Sql division 2 aggregate functions

Hier ist meine Frage, die ich versuchte, zu verwenden:

SELECT SUM(AWARD)/COUNT(*) FROM EVALUATION 
WHERE AWARD BETWEEN 2 AND 4 ; 

Aber ich verstehe, dass ich bin immer COUNT nur für Zeilen, die für die WHERE-Klausel geeignet sind. Was soll ich machen? Außerdem muss ich SUM of AWARDs mit Wert 2 hinzufügen, jedoch nur 50% davon.

+0

Verwenden Sie eine Unterabfrage, um mit zu teilen. – SomeJavaGuy

+0

@kevinEsche können Sie ein Beispiel geben? – quento

+0

Oracle unterstützt 'Avg()': https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions011.htm –

Antwort

3

können Sie bedingte Aggregation verwenden mit AVG():

SELECT AVG(CASE WHEN AWARD BETWEEN 2 AND 4 THEN AWARD ELSE 0 END) 
FROM EVALUATION; 

Natürlich können Sie die Teilung selbst tun, wenn Sie wirklich, wirklich wollen:

SELECT SUM(CASE WHEN AWARD BETWEEN 2 AND 4 THEN AWARD ELSE 0 END)/COUNT(*) 
FROM EVALUATION; 

EDIT (als Antwort auf einen Kommentar):

SELECT AVG(CASE WHEN AWARD = 2 THEN AWARD/2 
       WHEN AWARD BETWEEN 2 AND 4 THEN AWARD -- although 2 matches, it is caught in the first condition 
       ELSE 0 
      END) 
FROM EVALUATION; 
+0

danke! Ich fand die erste Lösung viel eleganter. Könntest du mir mit nur 50% des Wertes helfen, wenn AWARD = 2? – quento

+0

wird es wie sein: WENN AWARD = 2 THEN AWARD/2 – quento

1

dieses

Versuchen
SELECT SUM(CASE WHEN AWARD BETWEEN 2 AND 4 THEN AWARD ELSE 0 END)/COUNT(*) 
FROM EVALUATION