我的工作主要是报表,也没有逻辑层,全部是靠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
今日推荐
周排行