select 姓名,(sum(decode(状态,'充值',额度,0))-sum(decode(状态,'消费',额度,0))) 余额 from a
group by 姓名

解决方案 »

  1.   

    SQL> select * from test;NAME           STATE       COST
    --------- ---------- ----------
    jiang              0         40
    jiang              1        200
    bbbbb              1        113
    bbbbb              0         11已用时间:  00: 00: 00.01
    SQL> select name,sum(case
      2         when state = 0 then -cost
      3         when state = 1 then cost
      4         end ) cost
      5  from test
      6  group by name
      7  /NAME            COST
    --------- ----------
    bbbbb            102
    jiang            160已用时间:  00: 00: 00.00
      

  2.   

    select 姓名,SUM(DECODE(状态,'充值',额度,'消费',-1*额度)) from A group by 姓名
      

  3.   

    duanzilin(寻)  和 libin_ftsafe(子陌红尘)  都是正解!
    我的方法就补角死板!
    就不说了!不过一样可以!楼主给分吧!
      

  4.   

    zakat(听者如歌)的也是正解,谢谢大家,我决定给帖子再加20分.顺便问一下这三中方法哪个效率高点?
    为什么duanzilin(寻) 的方法最后一行会多出一个0来?
      

  5.   

    create table qxjtest1
    (
       name varchar2(20),
       state varchar2(20),
       forelock number(20,1)
    );insert into qxjtest1 values ('吴','消费 ','40.0');
    insert into qxjtest1 values ('吴','充值 ','133.0');
    insert into qxjtest1 values ('刘','充值 ','200.0');
    insert into qxjtest1 values ('刘','消费 ','11.0');select * from qxjtest1;select name,sum(case when trim(state)='消费' 
    then forelock*-1 
    else forelock end ) as cost from qxjtest1 group by name;
      

  6.   

    zakat(听者如歌)和libin_ftsafe(子陌红尘)的是对的,这2种方法原理一样,只是写法不同而已。
    至于我的为什么最后一行会多出一个0,不是很明白。
      

  7.   

    select name,sum(decode(trim(state),'消费',-1*forelock,'充值',forelock,0) ) 额
    from qxjtest1 group by name
      

  8.   

    其实decode和case的效率都差不太多的,case是decode的延伸,你的效率问题主要体现在where子句后的检索条件,看检索条件里有没有使用索引之类的。这里没有检索条件,所以效率也就差不多的