Ich habe eine Abfrage, die avg (Preis) zurückgibt.
select avg(price)
from(
select *, cume_dist() OVER (ORDER BY price desc) from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
and price>( select avg(price)* 0.50
from(select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)g
where cume_dist < 0.50
)
and price<( select avg(price)*2
from( select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)d
where cume_dist < 0.50)
)s
having count(*) > 5
Wie kann man 0 zurückgeben, wenn kein Wert verfügbar ist?
sql
postgresql
Andrew
quelle
quelle
from web_price_scan
ist eine separate Auswahl. nicht sicher, was das Problem hier ist?having
Klausel ohne a zu verwendengroup by
(standardmäßig eine einzelne Gruppe). Es fungiert alswhere
Klausel für aggregierte Ergebnisse. In diesem Fall werden die Zeilen nur zurückgegeben, wenn mehr als 5 Zeilen von der Unterabfrage der ersten Ebene zurückgegeben werden.Antworten:
Verwenden Sie Koaleszenz
Bearbeiten
Hier ist ein Beispiel für
COALESCE
Ihre Anfrage:IMHO
COALESCE
sollte nicht mit verwendet werden,AVG
da es den Wert ändert.NULL
bedeutet unbekannt und sonst nichts. Es ist nicht so, als würde man es benutzenSUM
. In diesem Beispiel ersetzen , wenn wirAVG
durchSUM
, wird das Ergebnis nicht verzerrt. Das Hinzufügen von 0 zu einer Summe schadet niemandem, aber wenn Sie einen Durchschnitt mit 0 für die unbekannten Werte berechnen, erhalten Sie nicht den tatsächlichen Durchschnitt.In diesem Fall würde ich hinzufügen ,
price IS NOT NULL
inWHERE
Klausel dieser unbekannten Werte zu vermeiden.quelle
from web_price_scan...
scheint wiederholt zu werden ...NULLIF(v1, v2)
ist das Gegenteil der Fall,COALESCE
dass es zurückkehrt,NULL
wenn esv1
gleich istv2
.(Diese Antwort wurde hinzugefügt, um der Frage kürzere und allgemeinere Beispiele zu geben - ohne alle fallspezifischen Details in die ursprüngliche Frage aufzunehmen.)
Hier gibt es zwei unterschiedliche "Probleme": Das erste ist, wenn eine Tabelle oder Unterabfrage keine Zeilen enthält, das zweite, wenn die Abfrage NULL-Werte enthält.
Bei allen von mir getesteten Versionen ignorieren postgres und mysql bei der Mittelwertbildung alle NULL-Werte und geben NULL zurück, wenn nichts zu mitteln ist. Dies ist im Allgemeinen sinnvoll, da NULL als "unbekannt" anzusehen ist. Wenn Sie dies überschreiben möchten, können Sie Coalesce verwenden (wie von Luc M vorgeschlagen).
Natürlich kann "from foo" durch "from (... jede komplizierte Logik hier ...) als foo" ersetzt werden.
Sollte nun die NULL-Zeile in der Tabelle als 0 gezählt werden? Dann muss die Koaleszenz innerhalb des durchschnittlichen Anrufs verwendet werden.
quelle
Ich kann mir zwei Möglichkeiten vorstellen, um dies zu erreichen:
IFNULL ():
Die Funktion IFNULL () gibt einen angegebenen Wert zurück, wenn der Ausdruck NULL ist. Wenn der Ausdruck NICHT NULL ist, gibt diese Funktion den Ausdruck zurück.
Syntax:
Beispiel für IFNULL () mit Ihrer Abfrage:
VERSCHMELZEN()
Die Funktion COALESCE () gibt den ersten Wert ungleich Null in einer Liste zurück.
Syntax:
Beispiel für COALESCE () mit Ihrer Abfrage:
quelle