交叉表 通用存储过程

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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值