CREATE
proc
p_qry
@TableName sysname, -- 表名
@纵轴 sysname, -- 交叉表最左面的列
@横轴 sysname, -- 交叉表最上面的列
@表体内容 sysname, -- 交叉表的数数据字段
@是否加横向合计 bit , -- 为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit , -- 为1时在交叉表纵向最下边加纵向合计
@where varchar ( 400 ) -- 查询where条件
as
declare @s nvarchar ( 4000 ), @sql varchar ( 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 @sum1 varchar ( 200 ), @sum2 varchar ( 200 ), @sum3 varchar ( 200 )
select @sum1 = case @是否加横向合计
when 1 then ' ,[合计]=sum([ ' + @表体内容 + ' ]) '
else '' end
, @sum2 = case @是否家纵向合计
when 1 then ' [ ' + @纵轴 + ' ]=case grouping([ '
+ @纵轴 + ' ]) when 1 then '' 合计 '' else cast([ '
+ @纵轴 + ' ] as varchar) end '
else ' [ ' + @纵轴 + ' ] ' end
, @sum3 = case @是否家纵向合计
when 1 then ' with rollup '
else '' end
-- 生成交叉表
exec ( ' select ' + @sum2 + @sql + @sum1 + '
from [ ' + @TableName + ' ] where ' + @where + '
group by [ ' + @纵轴 + ' ] ' + @sum3 )
GO
@TableName sysname, -- 表名
@纵轴 sysname, -- 交叉表最左面的列
@横轴 sysname, -- 交叉表最上面的列
@表体内容 sysname, -- 交叉表的数数据字段
@是否加横向合计 bit , -- 为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit , -- 为1时在交叉表纵向最下边加纵向合计
@where varchar ( 400 ) -- 查询where条件
as
declare @s nvarchar ( 4000 ), @sql varchar ( 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 @sum1 varchar ( 200 ), @sum2 varchar ( 200 ), @sum3 varchar ( 200 )
select @sum1 = case @是否加横向合计
when 1 then ' ,[合计]=sum([ ' + @表体内容 + ' ]) '
else '' end
, @sum2 = case @是否家纵向合计
when 1 then ' [ ' + @纵轴 + ' ]=case grouping([ '
+ @纵轴 + ' ]) when 1 then '' 合计 '' else cast([ '
+ @纵轴 + ' ] as varchar) end '
else ' [ ' + @纵轴 + ' ] ' end
, @sum3 = case @是否家纵向合计
when 1 then ' with rollup '
else '' end
-- 生成交叉表
exec ( ' select ' + @sum2 + @sql + @sum1 + '
from [ ' + @TableName + ' ] where ' + @where + '
group by [ ' + @纵轴 + ' ] ' + @sum3 )
GO