web-dev-qa-db-ja.com

CASE条件とSUM()を使用したSELECTクエリ

現在、これらのSQLステートメントを使用しています。私のテーブルには、「Cash」または「Check」を含むフィールドCPaymentTypeがあります。以下に示すように2つのSQLステートメントを実行することにより、支払い額を合計できます。この場合、ユーザーは2つのsqlステートメントまたは1つだけを実行する場合でも速度の違いに気づきませんが、私は自分のやり方が好きではありません。1つのSQLステートメントが必要です。これらをCASE条件で1つのステートメントに再構成するにはどうすればよいですか?オンラインの例では1または0またはブール値のいずれかになるため、私は理解できません。過去の小切手による支払いが含まれないようにします。どうもありがとうございました。

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

乾杯-

5
simon at rcl

個別の列で各合計を取得するには:

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

「または」を使用する

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" & "'"

または「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

私はあなたが判決書を必要とは思わない。 where句を更新し、句をグループ化するための正しい括弧があることを確認するだけです。

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

私の前に投稿された回答は、CDate <= SYSDATETIME()も現金支払いタイプに適していると仮定しています。私は小切手を支払うためにその条項だけを探すので、私は私のものを分割すると思います。

0
mmarie