2017-06-21 3 views
3

Ich mache Durchschnitt auf einer Spalte basierend auf Werten von zwei anderen Spalten.MySQL AVG falsches Ergebnis mit ELSE 0

Tabellenstruktur ist wie dieser

| rid | rate | status |.... 
| 1 | 1500 | 1 |.... 
| 1 | 1500 | 1 |.... 
| 1 | 1500 | 1 |.... 
| 1 | 1500 | 1 |.... 
| 2 | 1500 | 1 |.... 

Wenn ich diese Art und Weise tun es mir 1500 richtige Ergebnis gibt, aber es gibt NULL ohne CASE Spiel, ich AVG müssen 0 zurück, wenn keine Zeilen die CASE Bedingung entsprechen .

AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1 AS `avg` 

habe ich versucht auf diese Weise, aber seine mir falsches Ergebnis als 1200

AVG(CASE WHEN `rid` = `status` THEN `rate` ELSE 0 END) DIV 1 AS `avg` 

geben, warum ich falsch Ergebnis bin immer?

Bitte sehen Sie und schlagen Sie jede mögliche Weise vor, um dies zu tun.

Dank

+0

Würden Sie bitte Datensätze, für die Sie bekommen falsche Antwort? –

Antwort

3

Versuchen Sie, diese

IFNULL(AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1,0) AS `avg` 

Hinweis: MySQL IFNULL nimmt zwei Argumente, wenn erste Argumente nicht null ist, dann gibt es erste Argumente zurück, sonst gibt es zweite Argumente

+1

Das ist das gleiche wie meine Antwort, nur das proprietäre 'IFNULL' anstelle des Standards' COALESCE' zu verwenden und es sogar falsch anzuwenden. Bitte sehen Sie, wo Sie ', 0)' platziert haben. Es sollte entweder nach der schließenden Klammer von 'AVG' oder nach' DIV1' kommen, nicht nach dem Alias-Namen. –

0

Bewerben COALESCE auf Ihr Ergebnis:

COALESCE(AVG(CASE WHEN `rid` = `status` THEN `rate` END), 0) DIV 1 AS `avg` 
+2

Würde die Person, die das abgelehnt hat, bitte erklären, warum? Das OP hat eine Arbeitsformel (d. H. Behandelt nur rid = Statusdatensätze in der Formel, was zu dem korrekten Wert von 1500 für die Beispieldaten führt). Nur wenn es keinen rid = Status-Datensatz gibt, erhalten sie natürlich NULL statt Null. 'COALESCE' macht NULL zu einer Null und löst somit das Problem. Dies ist die Standardmethode und funktioniert in allen DBMS. –

+1

Sir Ihre Antwort ist mehr stranded Ansatz, aber ich werde 'IFNULL' als schneller verwenden. –

+0

@Tall Boy: Es macht mir nichts aus, dass du 'IFNULL' bevorzugst, aber ich bezweifle, dass es einen messbaren Unterschied in der Geschwindigkeit gibt. Kann nur einige Nanosekunden sein, denke ich. –

1
SELECT AVG(RATE) FROM TABLENAME GROUP BY rid,status 

obige Abfrage Versuchen.

Hoffe, das wird Ihnen helfen.

1

Sie erhalten 1200, weil die letzte Zeile, in der der Fall 0 zurückgibt, immer noch als Zeile zählt. Daher (1500 * 4 + 0)/5 = 1200.

1

Der Grund basiert wie Fall, wenn die Filter die Zeilen aus der Tabelle
Im ersten

AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1 AS `avg` 

die Bedingung für den Fall auswählen, wenn fo nur 4 Zeilen
tun, um die Tatsache ausgeführt wird, dass Sie nicht die Abfrage anderer Zustand ist Filter nur für die passende rid = status

In der zweiten

die else-Klausel impliziert die Verwendung auch von der letzten Reihe (rid = 2), so dass Sie haben 5 Reihen mit 4 gültigen Inhalt für avg