有这样一张表
desc t
name varchar2(255) pk,
rank varchar2(1) //值为1-4
insert into t values('a',1);
insert into t values('a',2);
insert into t values('a',3);
insert into t values('a',4);
insert into t values('a',1);
insert into t values('a',2);
insert into t values('b',1);
insert into t values('b',2);可是最终的报表要求的输出格式是:
name   rank_1_count    rank_2_count     rank_3_count     rank_4_count
a        2                2                1                 1
b        1                1                0                 0我现在的写法是通过一个复杂的sql完成的,有没有简单的写法或是oracle的内置函数可以完成?

解决方案 »

  1.   

    SELECT 
    name, 
    sum(decode(rank,1,1,0)) rank_1_count, 
    sum(decode(rank,2,1,0)) rank_2_count, 
    sum(decode(rank,3,1,0)) rank_3_count, 
    sum(decode(rank,4,1,0)) rank_4_count
    FROM t;
      

  2.   

    楼主这个效果你是自己写程序实现么?或者可以试试用工具来做呢?讲一下我的做法~
    貌似这张表里有两个字段name 和rankname  rank
    a      1
    a      2
    a      3
    a      4
    a      1
    a      2
    b      1
    b      2这样的数据结构,
    我是在FineReport的设计器中 把name和rank字段都拖入到格子里,然后再把name字段拖入格子,做成一个简单的交叉表,然后name字段设置属性为个数。就可以得到楼主想要的效果,整个过程不超过四步 没有楼上讲的那么复杂嘛
      

  3.   

    不好意思,应该使用是  count
    SELECT
    name,
    count(decode(rank,1,1,0)) rank_1_count,
    count(decode(rank,2,1,0)) rank_2_count,
    count(decode(rank,3,1,0)) rank_3_count,
    count(decode(rank,4,1,0)) rank_4_count
    FROM t
    group  by  name;
      

  4.   

    可以利用过程拼sql解决,出此之外还不知道有什么好的办法~~~
      

  5.   

    谢谢2楼,要说的是,是用sum,不是用count
      

  6.   

    用NULL应该可以实现,不过比较复杂!