Somme SQL avec condition

J’ai actuellement une déclaration SQL volumineuse à laquelle j’ajoute la ligne suivante afin d’obtenir le total de l’argent pour chaque ID de transaction (qui sont uniques):

select sum(cash) from Table a where a.branch = p.branch and a.transID = p.transID) TotalCash 

et j’ai maintenant besoin de faire la même chose mais seulement de cumuler les valeurs monétaires qui ont une valeur au cours du mois dernier, donc j’ai quelque chose comme ça:

 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 

Désolé que je n’ai pas la déclaration complète, mais c’est vraiment long et spécifique au contexte de la procédure stockée, mais j’espérais que quelqu’un sache ce que je veux dire?

Essayez plutôt ceci:

 SUM(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END) 

Explication

Votre expression CASE a une syntaxe incorrecte. Il semble que vous ayez confondu la syntaxe de l’expression CASE simple avec la syntaxe de l’expression CASE recherchée. Voir la documentation de CASE :

L’expression CASE a deux formats:

  • L’expression CASE simple compare une expression à un ensemble d’expressions simples pour déterminer le résultat.
  • L’expression CASE recherchée évalue un ensemble d’expressions booléennes pour déterminer le résultat.

Vous voulez la syntaxe de l’expression CASE recherchée:

 CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END 

En outre, si les performances posent problème, vous pouvez constater que cette expression s’exécute plus rapidement si vous réécrivez à l’aide de JOIN et de GROUP BY au lieu d’utiliser une sous-requête dépendante.

Essayez de déplacer 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 

(reformaté pour plus de clarté)

Vous pouvez également envisager d’utiliser ‘0’ au lieu de NULL, car vous faites une sum. Cela fonctionne correctement dans les deux sens, mais est peut-être plus indicatif de vos intentions.