Ich habe derzeit eine große SQL-Anweisung, der ich die folgende Zeile hinzufüge, um das gesamte Geld für jede Transaktions-ID (die eindeutig ist) zu erhalten:
select sum(cash) from Table a where a.branch = p.branch
and a.transID = p.transID) TotalCash
und ich muss jetzt das gleiche tun, aber nur die Barwerte summieren, die innerhalb des letzten Monats einen Wert haben, also habe ich so etwas:
select sum(CASE ValueDate WHEN > @startMonthDate THEN cash ELSE NULL END)
from Table a where a.branch = p.branch and a.transID = p.transID) TotalMonthCash
Es tut mir leid, dass ich nicht die gesamte Anweisung habe, aber sie ist wirklich lang und spezifisch für den Kontext der gespeicherten Prozedur, aber ich hatte gehofft, jemand würde wissen, was ich meine?
Antworten:
Versuchen Sie stattdessen Folgendes:
SUM(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END)
Erläuterung
Ihr CASE-Ausdruck hat eine falsche Syntax. Anscheinend verwechseln Sie die einfache CASE-Ausdruckssyntax mit der gesuchten CASE-Ausdruckssyntax. Siehe die Dokumentation zu CASE :
Sie möchten die gesuchte CASE-Ausdruckssyntax:
CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
Wenn die Leistung ein Problem darstellt, stellen Sie möglicherweise fest, dass dieser Ausdruck schneller ausgeführt wird, wenn Sie mit JOIN und GROUP BY anstelle einer abhängigen Unterabfrage neu schreiben.
quelle
Versuchen Sie sich zu bewegen
ValueDate
:select sum(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END) from Table a where a.branch = p.branch and a.transID = p.transID
(aus Gründen der Übersichtlichkeit neu formatiert)
Sie können auch '0' anstelle von NULL verwenden, da Sie eine Summe ausführen. Es funktioniert in beide Richtungen korrekt, zeigt aber möglicherweise eher Ihre Absichten an.
quelle
Mit der Bedingung HAVING werden Sie Daten mit Bargeld eliminieren, das nicht Ultrapass 0 ist, wenn Sie möchten, wodurch eine effizientere Abfrage generiert wird.
SELECT SUM(cash) AS money FROM Table t1, Table2 t2 WHERE t1.branch = t2.branch AND t1.transID = t2.transID AND ValueDate > @startMonthDate HAVING money > 0;
quelle