CREATE TABLE jax_t1(
f1 VARCHAR2(10),
f2 VARCHAR2(10),
f3 VARCHAR2(10));INSERT INTO jax_t1 values(1,分类1,1);
INSERT INTO jax_t1 values(1,分类2,1);
INSERT INTO jax_t1 values(2,分类1,1);
INSERT INTO jax_t1 values(2,分类2,1);
COMMIT;SELECT * FROM jax_t1;
--------------------------
序号    f1        f2     f3
1 1 分类1 1
2 1 分类2 1
3 2 分类1 1
4 2 分类2 1
在上面内容中,按照f2的分类,我想获得分类1的明细和两种分类的汇总结果如下序号    f1        f2     f3
1 1 分类1 1
2 1 所有 2
3 2 分类1 1
4 2 所有 2

解决方案 »

  1.   

    当然,使用union all可以解决问题,但这样会总成对表的两次遍历;我希望能通过遍历一次表实现,不知道有没有可能.
    select f1,f2,f3 from jax_t1 where f2 = '分类1'
    union all
    select f1,'所有',sum(f3) from jax_t1 group by f1,'所有'
      

  2.   

    select f1,decode(f2,'分类2','所有',f2),f3 from jax_t1;
      

  3.   

    sorry,理解错了!没有看明白你想要的是什么?
      

  4.   

    还是用union all比较方便..如果分类少的话.几个
    union all 就搞定了..
    用别的话..很麻烦..下面是我自己写的..
    但是不管多少个分类..分类多的时候适用..
    select f1,
           case
             when rn = 2 then
              '所有'
             else
              f2
           end f2,
           f3
      from (select decode(f1, '所有', 1, f1) f1,
                   f2,
                   f3,
                   row_number() over(partition by f2 order by f1) rn
              from (select f1, f2, f3, rownum rn1
                      from (select nvl(f1, '所有') f1,
                                   f2,
                                   sum(f3) f3,
                                   row_number() over(partition by f2 order by f1) rn
                              from jax_t1
                             group by rollup(f2, f1))
                     where rn = 1
                        or f1 = '所有')
             where rn1 < (select max(rn1)
                            from (select f1, f2, f3, rownum rn1
                                    from (select nvl(f1, '所有') f1,
                                                 f2,
                                                 sum(f3) f3,
                                                 row_number() over(partition by f2 order by f1) rn
                                            from jax_t1
                                           group by rollup(f2, f1))
                                   where rn = 1
                                      or f1 = '所有')))
    感觉自己写的很麻烦..不知道有没有更简单的写法..
      

  5.   

    这样select f1,f2,f3,count(f2)
    from jax_t1
    group by rollup(f1,f2,f3)就可以实现你上面的需求