如何在HAVING子句

时间:2016-05-04 16:14:24

标签: sql sql-server tsql

我尝试在网站上搜索有关此主题的答案,但找不到任何可以回答我问题的内容。我觉得这很简单。

我正在编写一个简单的SQL查询来帮助查找Unvouchered Purchase Orders,并且根据采购订单类型是Purchase还是Credit,它需要HAVING子句中的不同逻辑。为了获取数据,我必须编写两个不同的查询。请参阅下面的代码示例

购买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语句将它们组合时,我遇到了错误。最新的尝试是在=和&lt;上给我一个语法错误。登录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 

非常感谢任何想法或帮助。

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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

像这样。

相关问题