表名TABLE1
ID     业务号   材料名称     页号
105     1         申请表       1
106     1         申请表       2
107     1         申请表       3
108     1         审核表       4
109     1         审核表       5
110     1         身份证       6
111     1         证明材料     7
112     2   .......
113     3   .......
即业务号相同的行中,某种材料名称可能有好几页现在想做报表打印某个业务号的目录,比如想打印业务号为1的目录如下        申请表      1-3
        审核表      4-5
        身份证       6
        证明材料     7   
这段代码该怎么写?在VB论坛中我用网友教的方法
 select 材料名称,TO_CHAR(min(页号)) || '-' || TO_CHAR(max(页号))  from table1 where 业务号=1  group by 材料名称 ORDER BY min(页号)
 得到如下结果
        申请表      1-3
        审核表      4-5
        身份证      6-6  '我只想要的是 6
        证明材料    7-7  '我只想要的是 7
怎么改写这个语句呢,请大家帮我,很急。谢谢!

解决方案 »

  1.   

    用UNION ALL 试试 就是比较麻烦
      

  2.   

    不用语句,用存储过程就比较方便
    游标定义成 select 材料名称 from table1 where 业务号=1 group by 材料名称
    之后 循环
    select 材料名称,TO_CHAR(min(页号)) || '-' || TO_CHAR(max(页号))  from table1 where 业务号=1  group by 材料名称 ORDER BY min(页号)
    把TO_CHAR(min(页号)) || '-' || TO_CHAR(max(页号))放到一个变量里面
    加个IF判断TO_CHAR(min(页号))和TO_CHAR(max(页号))是否相等
    相等后就取TO_CHAR(max(页号)
    之后把这个结果插入一个临时表里面最后select * from 临时表效率比较低
    :)
      

  3.   

    看下面:CREATE TABLE PRINTTBL(ID NUMBER, SEQ NUMBER, NAME VARCHAR2(50), PAGE NUMBER)
    /INSERT INTO PRINTTBL
    SELECT 
    105,1,'申请表',1 FROM DUAL UNION SELECT
    106,1,'申请表',2 FROM DUAL UNION SELECT 
    107,1,'申请表',3 FROM DUAL UNION SELECT
    108,1,'审核表',4 FROM DUAL UNION SELECT
    109,1,'审核表',5 FROM DUAL UNION SELECT
    110,1,'身份证',6 FROM DUAL UNION SELECT
    111,1,'证明材料',7 FROM DUAL;
    /SELECT NAME, DECODE(COUNT(SEQ),1, TO_CHAR(MIN(PAGE)),TO_CHAR(MIN(PAGE)) || '-' || TO_CHAR(MAX(PAGE)))
    FROM PRINTTBL
    GROUP BY SEQ,NAME;
    /
      

  4.   

    /*加了一个ORDER BY子句*/
    SELECT NAME, DECODE(COUNT(SEQ),1, TO_CHAR(MIN(PAGE)),
                                      TO_CHAR(MIN(PAGE)) || '-' || TO_CHAR(MAX(PAGE))) AS SHOWPAGE
    FROM PRINTTBL
    GROUP BY SEQ,NAME
    ORDER BY DECODE(COUNT(SEQ),1, TO_CHAR(MIN(PAGE)),
                                      TO_CHAR(MIN(PAGE)) || '-' || TO_CHAR(MAX(PAGE)));
      

  5.   

    create table table1(id number(10),业务号 varchar2(10),材料名称 varchar2(10),页号 varchar2(10));
    不知道你字段类型,这样定义的。select t3.材料名称,decode(t3.num,1,t1.页号,t2.页号) 页号 from
    (select 材料名称,min(页号) 页号 from table1 where 业务号='1' group by 材料名称) t1,
    (select 材料名称,min(页号) || '-' || max(页号) 页号 from table1 where 业务号='1' group by 材料名称) t2,
    (select count(*) num,max(材料名称) 材料名称 from table1 where 业务号='1'  group by 材料名称) t3
    where t1.材料名称=t2.材料名称 and t2.材料名称=t3.材料名称 order by 页号;
      

  6.   

    其实只要稍微改下就可以满足你的要求了:
    select 材料名称,TO_CHAR(min(页号)) || '-' || TO_CHAR(max(页号)) from table1 where 业务号=1 group by 材料名称 ORDER BY min(页号)
    改为:
    select 材料名称,case when min_页号=max_页号 then to_char(min_页号) when min_页号<max_页号 then to_char(min_页号)||'-'||to_char(max_页号) end as result 
    from (
    select 材料名称,TO_CHAR(min(页号)) as min_页号, TO_CHAR(max(页号)) as max_页号  from table1 where 业务号=1 group by 材料名称 ORDER BY min(页号))BTW:真不习惯列名用汉字