我只能访问余额的-ve值

时间:2014-11-24 15:12:54

标签: oracle10g

select sum(b.budget) as  Budget,sum(b.rev) as Revised,sum(b.expe) as  Expenditure,(sum(b.budget) + sum(b.rev) - sum(b.expe))   as balance,
b.accounts,b.abac_code,
b.abac_name,b.dac_code,b.dac_name,b.abacname
 from 
 (
select upper('Budget') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname 
,0 Accounts,nvl(sum(nvl(g3.amt,0)),0) as budget,0 rev,0 expe
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4  and d.sl =afld_sl5 and upper(g3.typ) = upper('budget') 
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl = :drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all
select upper('Revised') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,nvl(sum(nvl(rev_amt,0)),0) as rev,0 expe 
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4  and d.sl =afld_sl5 and upper(g3.typ) = upper('budget') 
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl =:drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all 
select upper('Expenditure') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,0 rev,nvl(sum(nvl((abs(g.amt)),0)),0) expe
from gl g,chq c,acct_master ac,abac a ,dac d
where upper(typ) = upper('pay2') and g.vouchr_no>0 and g.amt>0 and g.acct_sl =ac.sl and ac.afld_sl4 =a.sl and ac.afld_sl5 =d.sl
and g.chq_sl=c.sl and g.drange_sl =:drange_sl and c.doc_date between :from_date and :to_date 
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl)
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
group by a.sl,a.code ,a.name ,d.code,d.name
order by dac_code
) b  
group by b.abac_code,b.abac_name,b.dac_code,b.dac_name,b.abacname,b.accounts
order by balance  

1 个答案:

答案 0 :(得分:0)

如果要引用余额,则必须再次将其包含在子查询中

 select * 
 from (
    select sum(b.budget) as Budget, 
           sum(b.rev)    as Revised,
           sum(b.expe)   as Expenditure,
           (sum(b.budget) + sum(b.rev) - sum(b.expe)) as balance,
           b.accounts, b.abac_code, b.abac_name, b.dac_code, b.dac_name, b.abacname
     from 
     (
         select upper('Budget') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname 
        ,0 Accounts,nvl(sum(nvl(g3.amt,0)),0) as budget,0 rev,0 expe
        from abac a,dac d,acct_master ac,gl3 g3
        where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4  and d.sl =afld_sl5 and upper(g3.typ) = upper('budget') 
        and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
        and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
        and g3.drange_sl = :drange_sl
        group by a.sl,a.code ,a.name ,d.code,d.name
      union all
        select upper('Revised') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
        0 Accounts,0 budget,nvl(sum(nvl(rev_amt,0)),0) as rev,0 expe 
        from abac a,dac d,acct_master ac,gl3 g3
        where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4  and d.sl =afld_sl5 and upper(g3.typ) = upper('budget') 
        and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
        and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
        and g3.drange_sl =:drange_sl
        group by a.sl,a.code ,a.name ,d.code,d.name
      union all 
        select upper('Expenditure') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
        0 Accounts,0 budget,0 rev,nvl(sum(nvl((abs(g.amt)),0)),0) expe
        from gl g,chq c,acct_master ac,abac a ,dac d
        where upper(typ) = upper('pay2') and g.vouchr_no>0 and g.amt>0 and g.acct_sl =ac.sl and ac.afld_sl4 =a.sl and ac.afld_sl5 =d.sl
        and g.chq_sl=c.sl and g.drange_sl =:drange_sl and c.doc_date between :from_date and :to_date 
        and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl)
        and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
        group by a.sl,a.code ,a.name ,d.code,d.name
        order by dac_code
    ) b  
    group by b.abac_code,b.abac_name,b.dac_code,b.dac_name,b.abacname,b.accounts
  ) a
where balance < 0
order by balance  

我没有尝试过,但您也可以使用HAVING子句

select sum(b.budget) as Budget, 
           sum(b.rev)    as Revised,
           sum(b.expe)   as Expenditure,
           (sum(b.budget) + sum(b.rev) - sum(b.expe)) as balance,
           b.accounts, b.abac_code, b.abac_name, b.dac_code, b.dac_name, b.abacname
     from 
     (
         select upper('Budget') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname 
        ,0 Accounts,nvl(sum(nvl(g3.amt,0)),0) as budget,0 rev,0 expe
        from abac a,dac d,acct_master ac,gl3 g3
        where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4  and d.sl =afld_sl5 and upper(g3.typ) = upper('budget') 
        and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
        and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
        and g3.drange_sl = :drange_sl
        group by a.sl,a.code ,a.name ,d.code,d.name
      union all
        select upper('Revised') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
        0 Accounts,0 budget,nvl(sum(nvl(rev_amt,0)),0) as rev,0 expe 
        from abac a,dac d,acct_master ac,gl3 g3
        where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4  and d.sl =afld_sl5 and upper(g3.typ) = upper('budget') 
        and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
        and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
        and g3.drange_sl =:drange_sl
        group by a.sl,a.code ,a.name ,d.code,d.name
      union all 
        select upper('Expenditure') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
        0 Accounts,0 budget,0 rev,nvl(sum(nvl((abs(g.amt)),0)),0) expe
        from gl g,chq c,acct_master ac,abac a ,dac d
        where upper(typ) = upper('pay2') and g.vouchr_no>0 and g.amt>0 and g.acct_sl =ac.sl and ac.afld_sl4 =a.sl and ac.afld_sl5 =d.sl
        and g.chq_sl=c.sl and g.drange_sl =:drange_sl and c.doc_date between :from_date and :to_date 
        and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl)
        and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
        group by a.sl,a.code ,a.name ,d.code,d.name
        order by dac_code
    ) b  
group by b.abac_code,b.abac_name,b.dac_code,b.dac_name,b.abacname,b.accounts
having (sum(b.budget) + sum(b.rev) - sum(b.expe))  < 0
order by balance