我用sql查出来的结果集。
CITY 年份 一级天数与有效监测天数 年度一级天数最多的月份 历年I级天数最多的月份 占年度百分比
鞍山 2005      9/361                   2005-08                2005-08       2%
鞍山 2006      7/363                   2006-07                2005-08       2%
鞍山 2008      8/156                   2008-05                2005-08       5%
鞍山 2004      7/211                   2004-07                2005-08       3%
鞍山 2007      10/363                   2007-08                2005-08               3%
安阳 2003      0/1                                                               
安阳 2002      0/1                                                               
包头 2003      0/1                                                          
鞍山 2005      9/361                   2005-08                2005-08       2%
鞍山 2006      7/363                   2006-07                2005-08       2%
鞍山 2008      8/156                   2008-05                2005-08       5%
鞍山 2004      7/211                   2004-07                2005-08       3%
鞍山 2007      10/363                   2007-08                2005-08               3%
安阳 2003      0/1                   想实现下的面格式.
不同城市不同年份空气质量I级天数对比分析
序号 城市          I级天数/有效监测天数   
                2002   2003 2004 2005 2006
1 北京                               
2 天津                                
3 石家庄                                
4 秦皇岛                                              

解决方案 »

  1.   

    又是行转列...如果年份是确定在某个范围内...用decode就能解决...不然就只能用过程.
      

  2.   

    固定列的好做
    max(decode(年份,'2005',一级天数与有效监测天数,null)) "2005"再配合group by 城市 ,就可以出来
    不固定列的话,麻烦
      

  3.   

    参考此贴吧
    http://topic.csdn.net/u/20080416/11/910e40c1-60f1-441f-8b0f-19a969d30f77.html
      

  4.   

    select city,
           max(decode(年份,2002,监测天数,null)) 2002,
           max(decode(年份,2003,监测天数,null)) 2003,
           ...
           max(decode(年份,2006,监测天数,null)) 2006,
      from table
     group by city
      

  5.   

    其实不固定列和固定列的写法一样...
    只是因为你事先不知道会出现哪些列...
    只能在过程中先查出会出现的列,再拼成SQL.
      

  6.   

    所以用max啊,是数字的话,也可以用sum了
      

  7.   

    学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    (得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    静态写法1、case when 写法 select  姓名,
          max(case 课程 when  '数学' then 分数 else  0 end 数学,
          max(case 课程 when  '语文' then 分数 else  0 end 语文,
                max(case 课程 when  '物理' then 分数 else  0 end 物理
    from  TB  group  by  姓名2、decode写法
    select  姓名,
          max(decode (课程,'数学',分数,0)) 数学,
          max(decode (课程,'语文',分数,0)) 语文,
                max(decode (课程,'物理',分数,0)) 物理
    from  TB  group  by  姓名动态写法declare
     lv_sql varchar2(1000);
     sql_command varchar2(5000);
      cursor   cur   is   select   课程   from   TB   group   by   课程;
     begin
      sql_command := 'select 姓名';
      for i in cur loop
      
        -- decode 写法
        sql_command := sql_command||' , max(decode(课程,'''||i.课程||''', 分数,0)) ' ||i.课程;
        -- case when 写法
        sql_command := sql_command||',max(case 课程 when '''||i.课程||''' then 分数 else 0 end ' || i.课程;
        
      end loop;
        
       sql_command := sql_command||' from  TB   group   by   姓名';    lv_sql := 'insert into temp_ss ' || sql_command;
       dbms_output.put_line(lv_sql);
       execute immediate lv_sql;end;
    你可以根据这个例子更改一下,把你的数据填到这里就可以了,希望对你有帮助
      

  8.   

    我用的是function,返回字符串无法查询,请看我另发的一个帖子。