我有一个执收码表(zs_billinfo),里面有个票据号码字段(startno)比如内容是 00001到10000啥的,但是中间有些票据号码缺少, 比如少00005,00010等,我现在需要把它按号码段统计出来。就是00001-00004为一段,00006-00009为一段,00011-10000为一段(因为我需要根据这些票段来统计金额,数量什么的东西),这个sql有没有办法做到呢?
原表格式
startno
00001
00002
00003
00004
00006
00007
00008
00009
00011
00012
...现在表格式
startno    endno
00001      00004
00006      00009
00011      10000

解决方案 »

  1.   

    SQL> select * from ZS_BILLINFO;
     
       STARTNO
    ----------
             1
             2
             3
             4
             6
             7
             8
             9
            11
            12
     
    10 rows selected
     
    SQL> 
    SQL> select min(startno) startno, max(startno) endno
      2    from ZS_BILLINFO
      3   group by (startno - rownum)
      4   order by 1;
     
       STARTNO      ENDNO
    ---------- ----------
             1          4
             6          9
            11         12
      

  2.   

     lag或lead比较相邻两个数字之差,>1的就是startno  或  endno 结合decode或case when
      

  3.   

    如果你的是字符型的要转换为number型的。再用以上语句
      

  4.   

    -- 连续数问题:
    SQL> SELECT MIN(STARTNO) STARTNO,
      2         MAX(STARTNO) ENDNO
      3    FROM (
      4          SELECT STARTNO,
      5                 STARTNO - ROWNUM RN
      6            FROM TABLE_NAME TT
      7         )YY
      8   GROUP BY RN;STARTNO ENDNO
    ------- -----
    00001   00004
    00006   00009
    00011   00012
      

  5.   

    试了下不需要
    SQL> select * from ZS_BILLINFO;
     
    STARTNO
    ----------
    00001
    00002
    00003
    00004
    00006
    00007
    00008
    00009
    00011
    00012
     
    10 rows selected
     
    SQL> 
    SQL> select min(startno) startno, max(startno) endno
      2    from ZS_BILLINFO
      3   group by (startno - rownum)
      4   order by 1;
     
    STARTNO    ENDNO
    ---------- ----------
    00001      00004
    00006      00009
    00011      00012
      

  6.   

    SELECT   MIN (aaa.startno) startno, MAX (aaa.startno) endno
        FROM (SELECT aa.*, SUM (aa.flag) OVER (ORDER BY aa.startno) flag_1
                FROM (SELECT a.*,
                             DECODE
                                (  LEAD (TO_NUMBER (startno),
                                         1,
                                         TO_NUMBER (startno) + 1
                                        ) OVER (ORDER BY a.startno)
                                 - TO_NUMBER (startno),
                                 1, 0,
                                 1
                                ) flag
                        FROM zs_billinfo a) aa)
    GROUP BY aaa.flag_1
      

  7.   


    --try it:select sum(金额) from zs_billinfo where startno>='00001' and startno<='00004' union
    (select sum(金额) from zs_billinfo where startno>='00006' and startno<='00009') union
    (select sum(金额) from zs_billinfo where startno>='00011' and startno<='10000'); 
      

  8.   


    DROP TABLE ZS_BILLINFO;
    CREATE TABLE ZS_BILLINFO(STARTNO VARCHAR2(10));SELECT * FROM ZS_BILLINFO;
        STARTNO
    1   00001
    2   00002
    3   00003
    4   00004
    5   00006
    6   00007
    7   00008
    8   00009
    9   00011
    10 00012
    SELECT MIN(STARTNO) STARTNO, MAX(STARTNO) ENDNO
      FROM (SELECT STARTNO, STARTNO - ROWNUM RN
              FROM ZS_BILLINFO
             ORDER BY STARTNO)
     GROUP BY RN
     ORDER BY RN;
      

  9.   

    MS逻辑还有点问题
    rownum  no 
    1      1  
    2      3
    3      6
    4      7
    5      10
    .       .
    .       .
    .       .
    100    103按照LS各位的思路
    6到103都成一组了!
      

  10.   

    这种情况出现的几率不大,如果有先按STARTNO列排序后再STARTNO-ROWNUM就好了。
      

  11.   

    你这种是根本不可能的情况,因为当no=10的时候,rownum=5也就是说no-rownum=5,那么后面的no与其对应的rownum之间的差最小也是等于5,如果后面就断的就会大于5,而不可能小于5,所以你说的当no=103时,rownum=100是不可能的,因为103-100=3
      

  12.   

    如果你的StartNo是有序且不会改变的值(例如递增字段),ROWNUM的方法就不会有问题了.ROWNUM是随着记录的增加而递增的,而且当某条记录被删除时,所有ROWNUM大于当前ROWNUM的都会减1,就是说ROWNUM永远都是不会有间隙的,从1开始,直到你的记录总数.