例如有个table有个字段为PROJECT,根据PROJECT的升序,取出的数据为:
PROJECT
000A
000A
000A
000F
000F
000K
000P
000P由于要写个Insert into...select语句,插入对象table有两个字段是GROUPID,DETAILNO
这两个字段的取法为,根据PROJECT的不同,GROUPID从00001开始连续,在相同的PROJECT中,DETAILNO从1连续
结果如下:
PROJECT      GROUPID      DETAILNO
000A            00001          1
000A            00001           2
000A            00001           3
000F            00002           1
000F            00002           2
000K            00003           1
000P            00004           1
000P            00004           2想请问一下,这个能不能实现呢?

解决方案 »

  1.   

    SQL> select * from t1;PRO
    --------------------
    000A
    000A
    000A
    000F
    000F
    000K
    000P
    000P8 rows selected.
    SQL> select pro,
      2  decode(pro,'000A','00001','000F','00002','000K','00003','000P','00004') gro
    upid,
      3  row_number() over(partition by pro order by pro) detailno
      4  from t1;PRO                  GROUP   DETAILNO
    -------------------- ----- ----------
    000A                 00001          1
    000A                 00001          2
    000A                 00001          3
    000F                 00002          1
    000F                 00002          2
    000K                 00003          1
    000P                 00004          1
    000P                 00004          28 rows selected.
      

  2.   

    当然 上面这个写法不够通用
    如果你PROJECT字段下像上面那样只有少数几个值的话倒还可行 如果多的话在写DECODE函数的时候就有点麻烦了同学催着出去打球了 一会回来了再看看等其他朋友写出更好的来
      

  3.   

    13:53:50 scott@TUNGKONG> select * from tb;PROJECT
    ----------
    000A
    000A
    000A
    000F
    000F
    000K
    000P
    000P已选择8行。已用时间:  00: 00: 00.00
    13:53:50 scott@TUNGKONG> select a.project,to_char(rn,'0000') GROUPID,row_number() over(partition by a.project order by a.project) DETAILNO from tb a,
    13:53:58   2  (select rownum rn,project from (select distinct project from tb order by project)) b
    13:53:58   3  where a.project = b.project;PROJECT    GROUP   DETAILNO
    ---------- ----- ----------
    000A        0001          1
    000A        0001          2
    000A        0001          3
    000F        0002          1
    000F        0002          2
    000K        0003          1
    000P        0004          1
    000P        0004          2已选择8行。已用时间:  00: 00: 00.03
      

  4.   

    select a.project,to_char(rn,'0000') GROUPID,row_number() over(partition by a.project order by a.project) DETAILNO from tb a,
    (select rownum rn,project from (select distinct project from tb order by project)) b
    where a.project = b.project order by project;
      

  5.   

    不就是一个dense_rank问题嘛select project,
      to_char(dense_rank()over(order by project))groupid,
      row_number()over(partition by project order by rownum)detailno
    from table1
      

  6.   

    create table proj(project varchar2(10));insert into proj values('000A');
    insert into proj values('000A');
    insert into proj values('000A');
    insert into proj values('000F');
    insert into proj values('000F');
    insert into proj values('000K');
    insert into proj values('000P');
    insert into proj values('000P');SELECT 
    project, 
    LPAD(
                 TO_CHAR(
                         dense_rank() over(order by project)
                        ), 5, '0'
                ) groupid ,
            ROW_NUMBER() over(partition by project order by project) detailno
    FROM proj;
      

  7.   

    to_char的format部分忘记写了
    补充下select project,
      to_char(dense_rank()over(order by project),'0000')groupid,
      row_number()over(partition by project order by rownum)detailno
    from table1
      

  8.   

    额。
    14:02:23 scott@TUNGKONG> select * from tb;PROJECT
    ----------
    000A
    000A
    000A
    000F
    000F
    000K
    000P
    000P已选择8行。已用时间:  00: 00: 00.03
    14:02:28 scott@TUNGKONG> select project,to_char(dense_rank()over(order by project),'0000') GROUPID,row_number() over(partition by project order by project) DETAILNO
    14:02:34   2  from tb order by project;PROJECT    GROUP   DETAILNO
    ---------- ----- ----------
    000A        0001          1
    000A        0001          2
    000A        0001          3
    000F        0002          1
    000F        0002          2
    000K        0003          1
    000P        0004          1
    000P        0004          2已选择8行。已用时间:  00: 00: 00.03
      

  9.   

    with temp
    as
    (
    select '000A' PROJECT  from dual
    union all
    select '000A'  from dual
    union all 
    select '000A'  from dual
    union all 
    select '000F'  from dual
    union all 
    select '000F'  from dual
    union all
    select '000K'  from dual
    union all
    select '000P'  from dual
    union all
    select '000P'  from dual
    )
    select a.project,b,rn from 
    (
    select  project,substr(project,1,3)||rownum b from 
    (select  distinct project from temp order by project ))A ,
    ( select project,
     row_number()over(partition by substr(project,length(project),1) order by project) rn from temp) b
     where A.project=B.project(+)--result:
    000A 0001 1
    000A 0001 2
    000A 0001 3
    000F 0002 1
    000F 0002 2
    000K 0003 1
    000P 0004 1
    000P 0004 2
      

  10.   

    重写一个
    SQL> select pro,
      2  lpad(to_char(dense_rank() over(order by pro)),5,'0') groupid,
      3  row_number() over(partition by pro order by pro) detailno
      4  from t1;PRO                  GROUPID           DETAILNO
    -------------------- --------------- ----------
    000A                 00001                    1
    000A                 00001                    2
    000A                 00001                    3
    000F                 00002                    1
    000F                 00002                    2
    000K                 00003                    1
    000P                 00004                    1
    000P                 00004                    28 rows selected.
      

  11.   

    这个和zcs_1写的不是一样的了吗
    我觉得都要经过to_char这一步,何必多此一举使用lpad函数?
      

  12.   

    呵呵 对哦 怎么写的和他一样了
    本来只是想借用一个他的LPAD的 
    结果给写成一样的了
      

  13.   

    with temp
    as
    (
    select '000A' PROJECT  from dual
    union all
    select '000A'  from dual
    union all 
    select '000A'  from dual
    union all 
    select '000F'  from dual
    union all 
    select '000F'  from dual
    union all
    select '000K'  from dual
    union all
    select '000P'  from dual
    union all
    select '000P'  from dual
    )select PROJECT,
      lpad(to_char(dense_rank() over(order by PROJECT)),5,'0') groupid,
      row_number() over(partition by PROJECT order by PROJECT) detailno
      from temp;