SQL-Summe mit Bedingung

73

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?

Anmut
quelle
Aufgrund Ihres Fragenverlaufs gehe ich davon aus, dass dies für SQL Server 2005 gilt, oder?
Mark Byers

Antworten:

130

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 :

Der CASE-Ausdruck hat zwei Formate:

  • Der einfache CASE-Ausdruck vergleicht einen Ausdruck mit einer Reihe einfacher Ausdrücke, um das Ergebnis zu bestimmen.
  • Der gesuchte CASE-Ausdruck wertet eine Reihe von Booleschen Ausdrücken aus, um das Ergebnis zu ermitteln.

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.

Mark Byers
quelle
7

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.

James Wiseman
quelle
0

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;
Jonathan Cedrim De Souza
quelle