CREATEproc p_qry @TableName sysname, --表名 @纵轴 sysname, --交叉表最左面的列 @横轴 sysname, --交叉表最上面的列 @表体内容 sysname, --交叉表的数数据字段 @是否加横向合计bit,--为1时在交叉表横向最右边加横向合计 @是否家纵向合计bit, --为1时在交叉表纵向最下边加纵向合计 @wherevarchar(400) --查询where条件 as declare@snvarchar(4000),@sqlvarchar(8000) --判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段 set@s='declare @a sysname if(select case when count(distinct ['+@纵轴+'])<count(distinct ['+@横轴+']) then 1 else 0 end from ['+@TableName+'])=1 select @a=@纵轴,@纵轴=@横轴,@横轴=@a' exec sp_executesql @s ,N'@纵轴 sysname out,@横轴 sysname out' ,@纵轴 out,@横轴 out --生成交叉表处理语句 set@s=' set @s='''' select @s=@s+'',[''+cast(['+@横轴+'] as varchar)+'']=sum(case ['+@横轴 +'] when ''''''+cast(['+@横轴+'] as varchar)+'''''' then ['+@表体内容+'] else 0 end)'' from ['+@TableName+'] group by ['+@横轴+']' exec sp_executesql @s ,N'@s varchar(8000) out' ,@sql out --是否生成合计字段的处理 declare@sum1varchar(200),@sum2varchar(200),@sum3varchar(200) select@sum1=case@是否加横向合计 when1then',[合计]=sum(['+@表体内容+'])' else''end ,@sum2=case@是否家纵向合计 when1then'['+@纵轴+']=case grouping([' +@纵轴+']) when 1 then ''合计'' else cast([' +@纵轴+'] as varchar) end' else'['+@纵轴+']'end ,@sum3=case@是否家纵向合计 when1then' with rollup' else''end --生成交叉表 exec('select '+@sum2+@sql+@sum1+' from ['+@TableName+'] where '+@where+' group by ['+@纵轴+']'+@sum3) GO