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';
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';
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é -
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';
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" & "'"
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.