Oracle在查询中定义字段名称,在where中使用

时间:2013-12-27 22:22:59

标签: sql oracle oracle11g

这似乎是一个非常愚蠢的问题,但是在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

(我正在网上搜索,但我不确定在搜索中使用哪些条款,所以还没有成功。)

1 个答案:

答案 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