动态交叉表就是列表会根据表中数据的情况动态创建列。
create procedure corss
@strTabName varchar(50), --表名
@strCol varchar(50), --列名
@strGroup varchar(50), --分组字段
@strNumber varchar(50), --被统计的字段
@strSum varchar(10)='Sum' --运算方式
as
declare @strSql varchar(1000),@strTempCol varchar(100)
execute('declare corss_cursor for select distinct'+@strCol+'from'+@strTabName+'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 --构造查询
execute(@strSql)
if @@error<>0 return @@error --如果出错,返回错误代码
close corss_cursor
deallocate corss_cursor return 0 --释放游标,返回0表示成功
end