大家好,问大家一个问题,现在有一张表里面有姓名(name)、余额万元(bal)两个字段,oracle里面有没有什么函数根据指定条件对返回的记录进行分组啊?分组的意思是每一个数据段都有一个唯一的标识符,比如能不能再增加一个临时字段(temp)方便在程序中调用
比如:
bal             temp
0-0.99            0
1-9.99            1
10-19.99          2
20-29.99          3
30-39.99          4
40-40.99          5
>50               6
这么七个组oracle能够实现这样的功能吗,或者大家还有另外的办法,帮帮小弟吧另外有人说可以用 case when then的办法,可是我不太会用,大家帮我想想该怎么写啊,谢谢大家了

解决方案 »

  1.   

    加个字段
    row_number()over(order by bal)temp
    是这个意思吗
      

  2.   

    select case when bal<1 then '0-0.99' when bal<10 then '1-9.99' when bal<20 then '10-19.99' when bal<30 then '20-29.99' when bal<40 then '30-39.99' when bal<50 then '40-49.99' else '>50' end bal, count(1) temp from tablea group by case when bal<1 then '0-0.99' when bal<10 then '1-9.99' when bal<20 then '10-19.99' when bal<30 then '20-29.99' when bal<40 then '30-39.99' when bal<50 then '40-49.99' else '>50' end
      

  3.   

    加上一个虚列select bal,(row_number() over (order by bal)) as tmp from tb
      

  4.   

    对,谢谢大家,就是这个意思,呵呵,数据库名 存款余额表(dd_mst),老大能帮我补充完整吗,就像4楼说得那样增加一个虚列可以吗?
      

  5.   

    类似在外围加入一列decode(bal,'0-0.99',0,'1-9.99',1,'10-19.99',2....,4,5)
    或者在外围来个row_number()over(...)
    或者你不嵌套直接加个case when bal <1 then ...
    像4楼的一样,只不过把'0-0.99'等等替换成012345
      

  6.   

    这个分组规律,用row_number over恐怕不行
      

  7.   

    在这个例子中可以
    对4楼的结果row_number()
    '0'>'-'
    因此'10-19.99'>'1-9.99'
    其他的更没问题
      

  8.   

    大概误会了,bal是数字,比如下面三条记录:
    name   bal
    a      0.8
    b      0.7
    c      1.2
    返回结果应该是
    a      0
    b      0
    c      1用dense_rank或有可能
      

  9.   

    大概误会了,bal是数字,比如下面三条记录:
    name   bal
    a      0.8
    b      0.7
    c      1.2
    返回结果应该是
    a      0
    b      0
    c      1用dense_rank或有可能
      

  10.   

    大概误会了,bal是数字,比如下面三条记录:
    name   bal
    a      0.8
    b      0.7
    c      1.2
    返回结果应该是
    a      0
    b      0
    c      1用dense_rank或有可能
      

  11.   

    我是楼主,inthirties给我的语句中把bal用‘0-0.99’等给替换了,我不想把bal字段用其他值替换,只是增加一个虚字段temp用来存储分组
    inthirties老大再帮我想想吧
    补充:数据库的名字叫存款余额表(dd_mst)我需要获得 客户姓名(name),余额(bal),产生一个虚列虚列(tmp),而虚列的值就像我上面提到的那样按余额赋值 赋值的规则是如果 bal<1 那么tmp就等于0,它们之间的对应关系如下:
                  bal            temp 
                0-0.99            0 
                1-9.99            1 
                10-19.99          2 
                20-29.99          3 
                30-39.99          4 
                40-40.99          5 
                 >50              6 这样子该怎么写select语句啊?大家帮帮我,这个select语句要返回name,bal,以及咱们生成的那个temp
    大家帮我写一下吧
      

  12.   

    case when bal<1 then 0 when bal>=50 then 6 else trunc(bal/10)+1 end
      

  13.   


    晕,不是替换了,你在case前增加bal,bal就回来了
      

  14.   

    还有一个问题,那就是能不能给生成的那个字段起一名字,我想把它做为sql查询中的一个中间变量,然后再把它代到sql里定义其他字段,谢谢大家了
      

  15.   

    case when .... end temp就可以了
      

  16.   

    谢谢 shiyiwan了,这下我全明白了