ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 行列转换

行列转换

原创 Linux操作系统 作者:syzxlyx_cu 时间:2009-09-28 11:10:31 0 删除 编辑

如何实现行列转换  
  [A]1、固定列数的行列转换  
  如  
  student   subject   grade  
  ---------------------------  
  student1   语文   80  
  student1   数学   70  
  student1   英语   60  
  student2   语文   90  
  student2   数学   80  
  student2   英语   100  
  ……  
  转换为    
  语文   数学   英语  
  student1   80   70   60  
  student2   90   80   100  
  ……  
  语句如下:  
  select   student,sum(decode(subject,'语文',   grade,null))   "语文",  
  sum(decode(subject,'数学',   grade,null))   "数学",  
  sum(decode(subject,'英语',   grade,null))   "英语"  
  from   table  
  group   by   student  
   
  2、不定列行列转换  
  如  
  c1   c2  
  --------------  
  1   我  
  1   是  
  1   谁  
  2   知  
  2   道  
  3   不  
  ……  
  转换为  
  1   我是谁  
  2   知道  
  3   不  
  这一类型的转换必须借助于PL/SQL来完成,这里给一个例子  
  CREATE   OR   REPLACE   FUNCTION   get_c2(tmp_c1   NUMBER)    
  RETURN   VARCHAR2    
  IS    
  Col_c2   VARCHAR2(4000);    
  BEGIN  
  FOR   cur   IN   (SELECT   c2   FROM   t   WHERE   c1=tmp_c1)   LOOP    
  Col_c2   :=   Col_c2||cur.c2;    
  END   LOOP;    
  Col_c2   :=   rtrim(Col_c2,1);  
  RETURN   Col_c2;    
  END;  
  /  
  SQL>   select   distinct   c1   ,get_c2(c1)   cc2   from   table;即可  
   
 
Top

5 楼wzs_wzs123(蓝天百云)回复于 2004-11-04 12:09:06 得分 0 rwpublic(rwpublic)   第二种没有实现由行到列的转换
Top

6 楼yjdn(人形机器)回复于 2004-11-04 12:17:40 得分 0 --测试  
  declare   col1   test.km%type;                 --定义类型  
          sqlstr   varchar2(8000);  
          cursor   c_try   is   select   distinct   km   from   test;  
          begin  
          sqlstr:='';  
          open   c_try;  
          loop  
          fetch   c_try   into   col1;  
          exit   when   c_try%notfound;  
          sqlstr:=sqlstr||',sum(decode(km,'''||col1||''',cj,0))   as   '||col1;  
          exit   when   c_try%notfound;  
          end   loop;  
          close   c_try;  
          sqlstr:='create   table   tt   as   select   name'||sqlstr||'   from   test   group   by   name';  
        --tt为刚创建的一个保存结果的表  
        execute   immediate   sqlstr;  
          end;  
   
  --执行  
  select   *   from   tt;  
  结果:  
  NAME                           数学               英语               语文  
  ----------   ----------   ----------   ----------  
  李四                               85                   78                   78  
  张三                               86                   75                   80  
   
   
  --楼主给出的数据有错,李四的英语成绩应该是78

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20542911/viewspace-615717/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 游标变量
下一篇: 建立扩展统计
请登录后发表评论 登录
全部评论

注册时间:2009-09-28

  • 博文量
    125
  • 访问量
    124052