2016-05-04 6 views
0

このトピックに関するサイトの検索を試みましたが、私の質問に答えたものが見つかりませんでした。私はこれがとてもシンプルだと感じています。HAVING句の中のCASE文の使い方

Unvouchered Purchase Ordersを検索するための簡単なSQLクエリを作成しています。購入注文タイプがPurchaseかCreditかによって、HAVING句に異なるロジックが必要です。データを取得するために、私は2つの異なるクエリを書く必要がありました。私がしたいことは一つにこれらの2つのクエリを組み合わせることであるが、私は使用してそれらを結合しようとすると、私はエラーに実行しています

購入PO

select 
prchseordr_id as 'PO ID', 
max(prchseordr_dte_rqstd) as DateRequested, 
max(prchseordr_type) as POType, 
max(vndr_nme) as Vendor, 
sum(imhstry_qntty_ordrd) as QuantityOrdered, 
sum(imhstry_qntty_invcd_ap) as QuantityVouchered 
from imhstry 
join prchseordr on imhstry.imhstry_ordr_id = prchseordr.prchseordr_id 
join brnch on prchseordr.brnch_rn = brnch.brnch_rn 
join vndr on prchseordr.vndr_rn = vndr.vndr_rn 
where prchseordr_dte_rqstd between '2016-01-01' and '2016-04-01' 
and prchseordr_type = 'PURCHASE' 
group by prchseordr.prchseordr_id 
HAVING sum(imhstry_qntty_invcd_ap) < sum(imhstry_qntty_ordrd) 
order by prchseordr_id asc 

CREDIT PO

select 
prchseordr_id as 'PO ID', 
max(prchseordr_dte_rqstd) as DateRequested, 
max(prchseordr_type) as POType, 
max(vndr_nme) as Vendor, 
sum(imhstry_qntty_ordrd) as QuantityOrdered, 
sum(imhstry_qntty_invcd_ap) as QuantityVouchered 
from imhstry 
join prchseordr on imhstry.imhstry_ordr_id = prchseordr.prchseordr_id 
join brnch on prchseordr.brnch_rn = brnch.brnch_rn 
join vndr on prchseordr.vndr_rn = vndr.vndr_rn 
where prchseordr_dte_rqstd between '2016-01-01' and '2016-04-01' 
and prchseordr_type = 'CREDIT' 
group by prchseordr.prchseordr_id 
HAVING sum(imhstry_qntty_invcd_ap) = '0' 
order by prchseordr_id asc 

次のコードサンプルを参照してください。 HAVING句のCASE文。最近の試みでは、HAVING句の=と<記号に構文エラーが表示されています。私は明らかに何か重要なことを見逃しています。

select 
prchseordr_id as 'PO ID', 
max(prchseordr_dte_rqstd) as DateRequested, 
max(prchseordr_type) as POType, 
max(vndr_nme) as Vendor, 
sum(imhstry_qntty_ordrd) as QuantityOrdered, 
sum(imhstry_qntty_invcd_ap) as QuantityVouchered 
from imhstry 
join prchseordr on imhstry.imhstry_ordr_id = prchseordr.prchseordr_id 
join brnch on prchseordr.brnch_rn = brnch.brnch_rn 
join vndr on prchseordr.vndr_rn = vndr.vndr_rn 
where prchseordr_dte_rqstd between '2016-01-01' and '2016-04-01' 
group by prchseordr.prchseordr_id 
HAVING CASE WHEN prchseordr_type = 'Credit' THEN sum(imhstry_qntty_invcd_ap) = '0' 
OR CASE WHEN prchseordr_type = 'Purchase' THEN sum(imhstry_qntty_invcd_ap) < sum(imhstry_qntty_ordrd) 
order by prchseordr_id asc 

ご意見やご協力をいただければ幸いです。

答えて

1

case式全体で集計を使用します。

select 
prchseordr_id as "PO ID", 
max(prchseordr_dte_rqstd) as DateRequested, 
prchseordr_type as POType, 
max(vndr_nme) as Vendor, 
sum(imhstry_qntty_ordrd) as QuantityOrdered, 
sum(imhstry_qntty_invcd_ap) as QuantityVouchered 
from imhstry 
join prchseordr on imhstry.imhstry_ordr_id = prchseordr.prchseordr_id 
join brnch on prchseordr.brnch_rn = brnch.brnch_rn 
join vndr on prchseordr.vndr_rn = vndr.vndr_rn 
where prchseordr_dte_rqstd between '2016-01-01' and '2016-04-01' 
group by prchseordr.prchseordr_id,prchseordr_type 
HAVING SUM(CASE WHEN prchseordr_type = 'Credit' THEN imhstry_qntty_invcd_ap END) = 0 
OR SUM(CASE WHEN prchseordr_type = 'Purchase' THEN imhstry_qntty_invcd_ap-imhstry_qntty_ordrd END) < 0 
order by prchseordr_id asc 
+0

ありがとうVKP!しかし、私はまだ構文エラーを取得しています。 HAVING句の各行の構文エラーが終了しました)。 –

+0

'case'に' end'がありませんでした。編集したバージョンを試してみてください。それが正常に動作しているかどうかを確認してください.i purchaseorder_typeのグループも削除しました。 –

+0

それは動作します!どうもありがとうございます! –

1
HAVING CASE 
WHEN prchseordr_type = 'Credit' AND sum(imhstry_qntty_invcd_ap) = '0' THEN 1 
WHEN prchseordr_type = 'Purchase' AND sum(imhstry_qntty_invcd_ap) < sum(imhstry_qntty_ordrd) THEN 1 
ELSE 0 END = 1 

このような何か。

+0

アレックスありがとう!これはうまくいった。 –