web-dev-qa-db-fra.com

Requête SELECT avec condition CASE et SUM ()

J'utilise actuellement ces instructions SQL. Ma table a le champ CPaymentType qui contient "Cash" ou "Cheque". Je peux résumer le montant des paiements en exécutant 2 instructions SQL comme indiqué ci-dessous. Dans ce cas, l'utilisateur ne remarquera même pas la différence de vitesse lors de l'exécution de 2 instructions sql ou juste 1, cependant, je n'aime pas mon chemin, je veux juste 1 instruction sql. Comment puis-je les reconstruire en 1 déclaration avec les conditions CASE? Je ne peux pas le comprendre car les exemples en ligne donnent 1 ou 0 ou booléen. Je ne veux pas que les paiements par chèque postdatés soient inclus. Merci beaucoup.

Select SUM(CAmount) as PaymentAmount 
from TableOrderPayment 
where CPaymentType='Cash' and CStatus='Active';

Select SUM(CAmount) as PaymentAmount 
from TableOrderPayment 
where CPaymentType='Check' and CDate<=SYSDATETIME() and CStatus='Active';
15
chris_techno25
Select SUM(CASE When CPayment='Cash' Then CAmount Else 0 End ) as CashPaymentAmount,
       SUM(CASE When CPayment='Check' Then CAmount Else 0 End ) as CheckPaymentAmount
from TableOrderPayment
Where ( CPayment='Cash' Or CPayment='Check' ) AND CDate<=SYSDATETIME() and CStatus='Active';
33
Mudassir Hasan
select CPaymentType, sum(CAmount)
from TableOrderPayment
where (CPaymentType = 'Cash' and CStatus = 'Active')
or (CPaymentType = 'Check' and CDate <= bsysdatetime() abd CStatus = 'Active')
group by CPaymentType

À votre santé -

5
simon at rcl

Pour obtenir chaque somme dans une colonne distincte:

Select SUM(IF(CPaymentType='Check', CAmount, 0)) as PaymentAmountCheck,
       SUM(IF(CPaymentType='Cash', CAmount, 0)) as PaymentAmountCash
from TableOrderPayment
where CPaymentType IN ('Check','Cash') 
and CDate<=SYSDATETIME() 
and CStatus='Active';
3
Galz

Utilisez un "Ou"

Select SUM(CAmount) as PaymentAmount 
from TableOrderPayment 
where (CPaymentType='Check' Or CPaymentType='Cash')
   and CDate <= case CPaymentType When 'Check' Then SYSDATETIME() else CDate End
   and CStatus='" & "Active" & "'"

ou un "IN"

Select SUM(CAmount) as PaymentAmount 
from TableOrderPayment 
where CPaymentType IN ('Check', 'Cash')
   and CDate <= case CPaymentType When 'Check' Then SYSDATETIME() else CDate End
   and CStatus='" & "Active" & "'"
0
Charles Bretana

Je ne pense pas que vous ayez besoin d'une déclaration de cas. Il vous suffit de mettre à jour votre clause where et de vous assurer d'avoir les bonnes parenthèses pour regrouper les clauses.

SELECT Sum(CAMount) as PaymentAmount 
from TableOrderPayment 
where (CStatus = 'Active' AND CPaymentType = 'Cash') 
OR (CStatus = 'Active' and CPaymentType = 'Check' and CDate<=SYSDATETIME())

Les réponses affichées avant la mienne supposent que CDate <= SYSDATETIME () est également approprié pour le type de paiement en espèces. Je pense que j'ai divisé le mien afin qu'il ne recherche que cette clause pour les paiements par chèque.

0
mmarie