我尝试在网站上搜索有关此主题的答案,但找不到任何可以回答我问题的内容。我觉得这很简单。
我正在编写一个简单的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
非常感谢任何想法或帮助。
答案 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
像这样。