2016-09-17 4 views
1
SELECT 
t1.aID, t1.firstname, t1.lastname, 
SUM(t2.price) AS sumsales 
FROM t3 
    INNER JOIN t1 
    ON t3.aID = t1.aID 
    INNER JOIN t2 
    ON t3.wID = t2.wID 
GROUP BY (t1.aID, t1.firstname, t1.lastname) 
ORDER BY sumsales DESC 

Wie kann ich alle Zeilen mit einer Nullsummen-Spalte aus den Ergebnissen dieser Oracle-SQL-Abfrage entfernen?Anzeigesumme der inneren verknüpften Tabellen ohne NULL-Summen

versuchte ich

WHERE sumsales IS NOT NULL 

oben GROUP BY aber es hat nicht funktioniert.

Ersetzen der Null durch eine 0 wäre auch akzeptabel, aber ich konnte nicht herausfinden, wie Null während/nach der Auswahl zu ersetzen.

Danke für Ihre Zeit.

+0

Benutzer nvl Funktion auf IE nvl (sum (t2.price), 0), sollte dies funktionieren –

+0

Haben Sie versucht 'mit abc AS (...) SELECT * FROM abc WHERE Summen ist nicht NULL;' oder 'haben 'Klausel? – manetsus

+0

@VinitPrajapati Vielen Dank, dass das Null auf 0 gesetzt hat – user2926952

Antwort

3

Da sumsales eine aggregierte Wert ist, sollten Sie having-Klausel verwenden:

SELECT 
t1.aID, t1.firstname, t1.lastname, 
SUM(t2.price) AS sumsales 
FROM t3 
    INNER JOIN t1 
    ON t3.aID = t1.aID 
    INNER JOIN t2 
    ON t3.wID = t2.wID 
GROUP BY (t1.aID, t1.firstname, t1.lastname) 
HAVING sumsales IS NOT NULL 
ORDER BY sumsales DESC 
1

Sie können die NULL Wert mit 0 ersetzen coalesce() mit:

SELECT t1.aID, t1.firstname, t1.lastname, 
     COALESCE(SUM(t2.price), 0) AS sumsales 
FROM t3 INNER JOIN 
    t1 
    ON t3.aID = t1.aID INNER JOIN 
    t2 
    ON t3.wID = t2.wID 
GROUP BY t1.aID, t1.firstname, t1.lastname 
ORDER BY sumsales DESC; 

Alternativ, wenn Sie nicht wollen, NULL Werte für sumsales, können Sie einfach NULL Preise vor die Aggregation herausfiltern n:

SELECT t1.aID, t1.firstname, t1.lastname, 
     SUM(t2.price AS sumsales 
FROM t3 INNER JOIN 
    t1 
    ON t3.aID = t1.aID INNER JOIN 
    t2 
    ON t3.wID = t2.wID 
WHERE t2.price IS NOT NULL 
GROUP BY t1.aID, t1.firstname, t1.lastname 
ORDER BY sumsales DESC; 

Dies wäre typischerweise der effizienteste Ansatz. Beachten Sie, dass Sie keine Aggregationsfunktionen in einer WHERE-Klausel verwenden können, aber Sie können sie in eine HAVING-Klausel einfügen, wie @NirLevy es empfiehlt.

Es ist auch unklar, was die Verbindung zu t3 erreicht, es sei denn, Sie haben es nur für Filterzwecke. Der Code verwendet keine Spalten aus dieser Tabelle.

Verwandte Themen