动态利用游标 实现行转列

         我的工作主要是报表,也没有逻辑层,全部是靠SQL 来实现功能,行转列,列转行.现在给大家分享一下,看看有没有更好的方法啊!
alter procedure corss 
 @strTabName varchar(50), --表名  
 @strCol varchar(50), --列名  
 @strGroup varchar(50),  --分组字段  
 @strNumber varchar(50), --被统计的字段  
 @strSum varchar(10)='Sum', --运算方式
 @term_str varchar(100)='where rkey=1' --提交语句   
 as 
 declare @strSql varchar(8000),@strTempCol varchar(100) 
 execute('declare corss_cursor cursor for select distinct'+@strCol+'from'+@strTabName+@term_str+'for read only') --生成游标  
begin 
set nocount on 
set @strSql='select'+@strGroup+','+@strSum+'('+@strNumber+') as ['+@strNumber+']' --查询的前半段  
open corss_cursor 
while(0=0) 
begin 
 fetch next from corss_cursor --遍历游标,将列头信息放入变量@strTempCol  
into @strTempCol 
 if(@@fetch_status<>0)break 
 set @strSql=@strSql+','+@strSum+'(case'+@strCol+'when'''+@strTempCol+'''then'+@strNumber+'else null end)as ['+@strTempCol+']'--gz查询  
  end 
 set @strSql=@strSql+'from'+@strTabName+'group by'+@strGroup --构造查询  
--PRINT @strSql
execute(@strSql) 
if @@error<>0 return @@error --如果出错,返回错误代码  
close corss_cursor 
 deallocate corss_cursor return 0 --释放游标,返回0表示成功  
end 
 
exec corss ' DATA0060 ',' day(ENT_DATE) ',' day(ENT_DATE) ',' PARTS_ORDERED ','SUM',' WHERE DATEDIFF(YEAR,ENT_DATE,GETDATE())=0'

猜你喜欢

转载自yanmingeye.iteye.com/blog/2023861