2016-05-04 6 views
0

Ich habe versucht, die Website für eine Antwort zu diesem Thema, aber konnte nichts finden, die meine Frage beantwortet. Ich habe das Gefühl, das ist sehr einfach.Wie CASE-Anweisung in HAVING-Klausel verwenden

Ich schreibe eine einfache SQL-Abfrage, um bei der Suche nach unbeaufsichtigten Bestellungen zu helfen. Je nachdem, ob die Bestellart Purchase oder Credit ist, wird in der HAVING-Klausel eine andere Logik benötigt. Um die Daten zu bekommen, musste ich zwei verschiedene Abfragen schreiben. Siehe Codebeispiele unten

KAUF 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 

Was ich will, ist, diese beiden Abfragen in einem kombinieren, aber ich laufe in Fehler, wenn ich versuche, sie zu kombinieren mit eine CASE-Anweisung in der HAVING-Klausel. Der letzte Versuch wirft mir einen Syntaxfehler auf das Zeichen = und < in der HAVING-Klausel. Mir fehlt offensichtlich etwas Wichtiges.

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 

Alle Ideen oder Hilfe würde sehr geschätzt werden.

Antwort

1

Verwenden Sie die Aggregation für den gesamten Ausdruck 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

Danke VKP! Ich bekomme jedoch immer noch einen Syntaxfehler. Die Syntaxfehler befinden sich nun beim Schließen) jeder Zeile der HAVING-Klausel. –

+0

das 'case' fehlte ein' end'. Versuchen Sie die bearbeitete Version und sehen Sie, ob es funktioniert. Ich habe auch die Gruppierung auf purchaseorder_type.not sicher darüber entfernt. –

+0

Es funktioniert! Ich danke dir sehr! –

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 

Etwas Ähnliches.

+0

Danke Alex! Das hat super funktioniert. –