簡體   English   中英

如何在HAVING子句中使用CASE語句

[英]How to use CASE statement inside HAVING clause

我試圖在網站上搜索有關此主題的答案,但找不到任何能回答我問題的內容。 我覺得這很簡單。

我正在編寫一個簡單的SQL查詢來幫助查找未憑證的采購訂單,並且取決於采購訂單類型是Purchase還是Credit,它在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'
and prchseordr_type = 'PURCHASE'
group by prchseordr.prchseordr_id
HAVING sum(imhstry_qntty_invcd_ap) < sum(imhstry_qntty_ordrd)
order by prchseordr_id asc 

信貸訂單

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 

任何想法或幫助將不勝感激。

在整個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 
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

這樣的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM