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
  )