登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

飞哥的技术博客

世上无难事,只怕有心人!

 
 
 

日志

 
 
 
 

动态语句编写行转列的SQL   

2009-06-23 20:23:33|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

动态语句编写行转列的SQL,可以防止一些列的值是未知的情况下可以使用动态语句来将行转换为列: 

举例如下:

表名:TB1
SEQ ID   NAME
----------------
1   1A     AA
2   2B     BB
3   3C     CC
需要改为

1A   2B   3C
--------------
AA   BB   CC


create table TB1
(SEQ  number,
ID    varchar2(10),
NAME  varchar2(10))

select t.* from tb1 t

select distinct A.* from(
select (case when then name else (select name from TB1 where )  end) "1A"
      ,(case when then name else (select name from TB1 where )  end) "2B"
      ,(case when then name else (select name from TB1 where )  end) "3C"
 from TB1
 )A
--写成动态语句的存储过程
create or replace procedure testdm(mycursor out  sys_refcursor) is
m_sql  varchar2(4000);
m_sql1 varchar2(4000);
c sys_refcursor;
temp varchar2(10);
begin
m_sql:=' select distinct * from( select ';
OPEN c for
select distinct id from tb1;
loop
fetch c into temp;
EXIT WHEN (c%NOTFOUND);
m_sql1:=m_sql1||',(case when '||temp||''' then name else (select name from TB1 where ' ||temp||''' ) end) "'||temp||'" ';
END LOOP;
m_sql1:=LTRIM(m_sql1,',');
m_sql:=m_sql||m_sql1||' from TB1 ) A';
open mycursor for
m_sql;
end testdm;

下面的SQL语句是oracle群里一个朋友的写法,记录下来供大家分享:
SQL2000的写法:
create table aa([Name] varchar(10),[Subject] varchar(20),Result int);
insert into aa([Name],[Subject],Result)
select '张三','语文',80 union all
select '张三','数学',90 union all
select '张三','物理',85 union all
select '李四','语文',85 union all
select '李四','数学',92 union all
select '李四','物理',82

declare @sql varchar(4000)
set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']' from (select distinct Subject from aa) as a
select @sql = @sql+' from aa group by name'
select @sql
exec(@sql)


drop table aa

  评论这张
 
阅读(1548)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018