这似乎是一个非常愚蠢的问题,但是在where子句中定义cutoffAmt字段的正确语法是什么?
select acct_id
, sum(amt_due_per3) as tot_amt_due_per3
, sum(amt_due_per4) as tot_amt_due_per4
, abs (sum(amt_due_per3) + sum(amt_due_per4)) as cutoffAmt
from ( select acct_id
, amt_due_per3
, amt_due_per4
from mytable
where acct_id = '4679721000')
where cutoffAmt > 100.0
group by acct_id
如果我放弃最后一个where子句,查询就可以了;但是''cutoffAmt> 100.0',我收到一个ORA-00904无效标识符。我用名称(“cutoffAmt”)和上面的引号尝试了它。我已经尝试过abs(tot_amt_due_per3 + tot_amt_due_per4)> 100,然后它抱怨那些字段名称。我不能在where子句中使用sum。如果我只是在where子句中引用amt_due_per3和amt_due_per4,那么它不会查看分组的总计。 (我故意选择了一个帐户,其中所有单个金额都在100以下,但总和都在100以上。)
我有一个更复杂的查询,因此查询中的查询,但上面的代码与我一样,除了表名,它也无法使用这个简单的代码段。
这是我的数据,如果重要
Acct_id amt_due_per3 amt_due_per4
4679721000 21.75 21.75
4679721000 16.41 19.38
4679721000 28.09 40.31
(我正在网上搜索,但我不确定在搜索中使用哪些条款,所以还没有成功。)
答案 0 :(得分:4)
WHERE子句在聚合之前过滤行。要过滤组,请使用HAVING子句:
select acct_id
, sum(amt_due_per3) as tot_amt_due_per3
, sum(amt_due_per4) as tot_amt_due_per4
, abs (sum(amt_due_per3) + sum(amt_due_per4)) as cutoffAmt
from ( select acct_id
, amt_due_per3
, amt_due_per4
from mytable
where acct_id = '4679721000')
group by acct_id
having abs (sum(amt_due_per3) + sum(amt_due_per4)) > 100.0
或者,包装子查询:
select * from (
select acct_id
, sum(amt_due_per3) as tot_amt_due_per3
, sum(amt_due_per4) as tot_amt_due_per4
, abs (sum(amt_due_per3) + sum(amt_due_per4)) as cutoffAmt
from ( select acct_id
, amt_due_per3
, amt_due_per4
from mytable
where acct_id = '4679721000')
group by acct_id
)
where cutoffAmt > 100.0