【问题标题】:I have to access only -ve values of balance我只需要访问 -ve 的 balance 值
【发布时间】:2014-11-24 15:12:54
【问题描述】:
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  

【问题讨论】:

  • 你到底希望我们如何处理你扔在这里的无格式的烂摊子?
  • omg...你能和我们分享一下这个问题吗?
  • 它就像一个多重查询...select a.name,b.code,c.add from (select name from a
  • 它就像一个多重查询...我用简单的例子来展示... select d.name,d.code,d.add from ( select name from a union all select code from b union all从 c 中选择添加)d
  • 请编辑您的问题 1) 在散文中告诉我们您想要做什么,您的问题是什么以及您的问题是什么 2) 使用格式化工具来格式化代码。 3)使标题成为一个问题,目前它是一个陈述。如果您希望得到答案,您必须提出问题。顺便说一句:你是写SQL 声明还是从某个地方得到的?

标签: oracle10g


【解决方案1】:

如果你想引用余额,你必须再次将它包含到子查询中

 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  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2014-03-10
    • 2012-05-02
    • 2023-02-21
    相关资源
    最近更新 更多