Sql 表内部在having子句中使用sum函数连接到自身
我有一个返回错误结果的查询:Sql 表内部在having子句中使用sum函数连接到自身,sql,oracle,Sql,Oracle,我有一个返回错误结果的查询: select sum(count(distinct stcr1.sfrstcr_pidm)) as sum_all from saturn.sfrstcr stcr1 inner join saturn.sfrstcr stcr2 on stcr1.sfrstcr_pidm = stcr2.sfrstcr_pidm where stcr1.sfrstcr_term_code = '200808' and stcr2.sfrstcr_term_code
select sum(count(distinct stcr1.sfrstcr_pidm)) as sum_all
from saturn.sfrstcr stcr1
inner join saturn.sfrstcr stcr2
on stcr1.sfrstcr_pidm = stcr2.sfrstcr_pidm
where stcr1.sfrstcr_term_code = '200808'
and stcr2.sfrstcr_term_code = '200908'
group by stcr1.sfrstcr_pidm
having sum(stcr1.sfrstcr_credit_hr) >= 12
我希望查询提供总数至少为12的
stcr1.sfrstcr\u pidm
的stcr1.sfrstcr\u credit\u hr
,并且存在于stcr2
中。虽然saturn.sfrstcr
中的每条记录都是唯一的,sfrstcr_pidm
在其列中可以有任意数量的重复条目
但是,对于stcr2.sfrstcr\u pidm
的每个实例,查询将取stcr1.sfrstcr\u credit\u hr
的总和。因此,例如,如果stcr1.sfrstcr_credit_hr
的和实际上是6,但是有两个stcr2.sfrstcr_pidm
的实例连接到stcr1.sfrstcr_pidm
,那么查询得到的和是12,并且错误地将stcr1.sfrstcr_pidm
添加到结果中。至少我认为是这样的
如果我替换
having sum(stcr1.sfrstcr_credit_hr) >= 12
与
我得到了正确的结果,但似乎应该有更好的方法来做到这一点,它不涉及having子句中的子查询。有什么建议吗?“我希望查询提供stcr1.sfrstcr\u pidm的编号,该编号的总stcr1.sfrstcr\u credit\u hr至少为12,并且存在于stcr2中。”
如果我没有遗漏问题的细微差别,这似乎是一个相当直接的方法:
select count(distinct sfrstcr_pidm)
from
(
select sfrstcr_pidm
from saturn.sfrstcr
where sfrstcr_term_code = '200808'
and sfrstcr_pidm in
(select sfrstcr_pidm
from saturn.sfrstcr
where sfrstcr_term_code = '200809')
group by sfrstcr_pidm
having sum(sfrstcr_credit_hr) >= 12
)
在子查询中,使用stcr3.sfrstcr\u term\u code='200808',而在原始查询中,使用stcr2.sfrstcr\u term\u code='200908'。如果使用stcr2.sfrstcr\u term\u code='200808,则可能会得到与子查询相同的结果。或者,如果将子查询更改为stcr3.sfrstcr_term_code='200808',子查询是否仍然有效?“有两个stcr2.sfrstcr_pidm实例连接到stcr1.sfrstcr_pidm”似乎是sfrstcr\u term\u code=200908的情况,而不是sfrstcr\u term\u code=200808
stcr3。sfrstcr\u term\u code
必须匹配stcr1.sfrstcr\u term\u code
,因为我想要stcr1
术语代码的总sfrstcr\u信用度
。stcr2
术语代码不同,因为我正在检查200808中的stcr1.sfrstcr\u pidm
,这也会产生相同的结果。感谢您提供了另一种方法。
select count(distinct sfrstcr_pidm)
from
(
select sfrstcr_pidm
from saturn.sfrstcr
where sfrstcr_term_code = '200808'
and sfrstcr_pidm in
(select sfrstcr_pidm
from saturn.sfrstcr
where sfrstcr_term_code = '200809')
group by sfrstcr_pidm
having sum(sfrstcr_credit_hr) >= 12
)