有一张表:

名字     发票大类      发票小类         发票号


张三     固定发票     50元固定发票     1001001
张三     固定发票     50元固定发票     1001002
张三     固定发票     50元固定发票     1001003


李四     固定发票     50元固定发票     1001004
李四     固定发票     50元固定发票     1001005
李四     固定发票     50元固定发票     1001006


王五     固定发票     50元固定发票     1001007
王五     固定发票     50元固定发票     1001008
求结果输出:

名字     发票大类      发票小类       起始发票号          终止发票号     

张三     固定发票     50元固定发票      1001001             1001003
李四     固定发票     50元固定发票      1001004             1001006
王五     固定发票     50元固定发票      1001007             1001008 

解决方案 »

  1.   


    select 名字,发票大类,发票小类,max(发票号),min(发票号) 
    from table group by 名字,发票大类,发票小类
      

  2.   

    select 
    名字, 发票大类, 发票小类,
    min(发票号) as 起始发票号,
    max(发票号) as 终止发票号
    from TableName
    group by 名字, 发票大类, 发票小类
      

  3.   

    select 名字,发票大类,发票小类,min(发票号) as 起始发票号,max(发票号) 终止发票号
    from table
    group by 名字,发票大类,发票小类
      

  4.   

    上面各位大仙的SQL不符合要求,请先测试一下
      

  5.   

    我是楼主:
    上面各位大仙的SQL不符合要求,请先测试一下
      

  6.   

    你的发票号是字符型的?to_number转成number
      

  7.   

    不是这个原因,你上面的SQL只能查询出两条记录,我要求的查询结果和你写的SQL有点出入,你可以测试一下
      

  8.   

    with t as(
    select '张三' username, '固定发票' dl, '50元固定发票' xl, 1001001 bh from dual
    union all select '张三' , '固定发票' , '50元固定发票', 1001002 from dual
    union all select '张三' , '固定发票' , '50元固定发票', 1001003  from dualunion all select '李四', '固定发票', '50元固定发票' , 1001004  from dual
    union all select '李四', '固定发票', '50元固定发票' , 1001005  from dual
    union all select '李四', '固定发票', '50元固定发票' , 1001006  from dualunion all select '王五', '固定发票', '50元固定发票' , 1001007  from dual
    union all select '王五', '固定发票', '50元固定发票' , 1001008  from dual)
    select username,dl,xl,min(bh),max(bh) from t group by username,dl,xl;
      

  9.   

    我是楼主:
    不好意思,我的描述有点问题,原始需求是:

    username   dl             xl           bh
    张三      固定发票      50元固定发票     1001001
    张三      固定发票      50元固定发票     1001002
    张三      固定发票      50元固定发票     1001003
    李四      固定发票      50元固定发票     1001004
    李四      固定发票      50元固定发票     1001005
    李四      固定发票      50元固定发票     1001006
    张三      固定发票      50元固定发票     1001007
    张三      固定发票      50元固定发票     1001008求结果输出:
    username   dl            xl          min_bh       max_bh
    张三     固定发票       50元固定发票     1001001      1001003
    李四     固定发票       50元固定发票     1001004      1001006
    张三     固定发票       50元固定发票     1001007      1001008  
      

  10.   

    我是楼主:
    难点在于,按username分组的时候,因为‘张三’要分为两段
      

  11.   

    with t as(
    select '张三' username, '固定发票' dl, '50元固定发票' xl, 1001001 bh from dual
    union all select '张三' , '固定发票' , '50元固定发票', 1001002 from dual
    union all select '张三' , '固定发票' , '50元固定发票', 1001003  from dualunion all select '李四', '固定发票', '50元固定发票' , 1001004  from dual
    union all select '李四', '固定发票', '50元固定发票' , 1001005  from dual
    union all select '李四', '固定发票', '50元固定发票' , 1001006  from dualunion all select '王五', '固定发票', '50元固定发票' , 1001007  from dual
    union all select '王五', '固定发票', '50元固定发票' , 1001008  from dual)
    select username,dl,xl,min(bh),max(bh) from 
        (select username,dl,xl,bh,bh-row_number() over(partition by username,dl,xl,order by bh xxl from t)  group by username,dl,xl,xxl;
      

  12.   

    --试试这个,先按username排序,然后再做分类处理,最后再把分类信息抛弃,
    WITH t AS
      (SELECT '张三' AS userName,
        '固定发票'     AS classes,
        '50元固定发票'  AS subClasses,
        '1001001'  AS code
      FROM dual
      UNION ALL
      SELECT '张三','固定发票','50元固定发票','1001002' FROM dual
      UNION ALL
      SELECT '张三','固定发票','50元固定发票','1001003' FROM dual
      UNION ALL
      SELECT '李四','固定发票','50元固定发票','1001004' FROM dual
      UNION ALL
      SELECT '李四','固定发票','50元固定发票','1001005' FROM dual
      UNION ALL
      SELECT '李四','固定发票','50元固定发票','1001006' FROM dual
      UNION ALL
      SELECT '张三','固定发票','50元固定发票','1001007' FROM dual
      UNION ALL
      SELECT '张三','固定发票','50元固定发票','1001008' FROM dual
      )
    select username,classes,subclasses,min(code) ,max(code) from (
    select username,classes,subclasses,code,code-rownum as a from (
    select * from t order by username,classes,subclasses,code
    )
    ) group by username,classes,subclasses,a
    --结果
    USERNAME CLASSES  SUBCLASSES   MIN(CODE) MAX(CODE) 
    -------- -------- ------------ --------- --------- 
    李四     固定发票  50元固定发票  1001004   1001006   
    张三     固定发票  50元固定发票  1001001   1001003   
    张三     固定发票  50元固定发票  1001007   1001008  
      

  13.   

    select 
        t.名字 ,
        t.发票大类,
        t.发票小类,
        t.min(发票号),
        t.max(发票号)
      from 
         (
           select 
               名字 ,
               发票大类,
               发票小类,
               发票号,
               row_number() over(partition by 名字 order by 发票号) rn 
             from table
         ) t
    group by 名字 ,t.发票大类,t.发票小类,t.rn-t.发票号-----说明------
    1.先按 姓名 发票种类 发票编号从小到大排序,并记录行号 如下
    用张三举例:
    张三 固定发票 50元固定发票 1001001   1
    张三 固定发票 50元固定发票 1001002   2
    张三 固定发票 50元固定发票 1001003   3
    张三 固定发票 50元固定发票 1001007   4
    张三 固定发票 50元固定发票 1001008   52.接着重点来了
    1001001,1001002,1001003 他们是连号最后输出就是最小和最大 也就是
    张三 固定发票 50元固定发票 1001001   10010031001007和1001003隔断了 就另起一组 它和1001008又是连号的
    就显示为 
    张三 固定发票 50元固定发票 1001007   1001008
    3.核心思路来了
    1001001   1   0
    1001002   2   0
    1001003   3   0
    1001007   4   3
    1001008   5   3group by rn-发票号 取max min代码未经测试,懒得建表导数据,思路告诉你了,请给分!多谢
      

  14.   

    WITH t AS
     (SELECT '张三' AS userName, '固定发票' AS classes, '50元固定发票' AS subClasses,
             '1001001' AS code
        FROM dual
      UNION ALL
      SELECT '张三', '固定发票', '50元固定发票', '1001002'
        FROM dual
      UNION ALL
      SELECT '张三', '固定发票', '50元固定发票', '1001003'
        FROM dual
      UNION ALL
      SELECT '李四', '固定发票', '50元固定发票', '1001004'
        FROM dual
      UNION ALL
      SELECT '李四', '固定发票', '50元固定发票', '1001005'
        FROM dual
      UNION ALL
      SELECT '李四', '固定发票', '50元固定发票', '1001006'
        FROM dual
      UNION ALL
      SELECT '张三', '固定发票', '50元固定发票', '1001009'
        FROM dual
      UNION ALL
      SELECT '张三', '固定发票', '50元固定发票', '1001007' FROM dual)select username, classes, subclasses,min(code), max(code) from (
    select username, classes, subclasses,code, to_number(code)- row_number()  over(partition by username, classes, subclasses order by code) F5
      from t
     order by username, classes, subclasses, code)
    group by username, classes, subclasses,F5
      

  15.   

    最好最简单的应该用decode()函数