zoukankan      html  css  js  c++  java
  • 通用动态交叉表的实现


    -- ============================================================================
    -- 通用动态交叉表的实现
    -------------------------------------------------------------------------------
    -- usp_Crosstab
    -------------------------------------------------------------------------------

    CREATE                  PROCEDURE usp_Crosstab
     @table varchar(50),   --表名
     @sumRow varchar(8000),  --合计列字段
     @groupRow varchar(1000),  --分组列字段
     @col varchar(50),   --要将列值转换为列的列字段
     @colTable varchar(1000), --要将列值转换为列的列字段表
     @Sortfield varchar(100), --要将列值转换为列的列字段表排序字段
     @SubSortfield varchar(100), --要将列值转换为列的列字段表子排序字段  
     @content varchar(50),   --列值转换为列后列的内容字段
     @showSum varchar(50),  --显示总计列名
     @showSubtotal varchar(50), --显示小计列
     @where varchar(8000)  --查询条件
    AS
     DECLARE @declareSql varchar(8000),  --变量定义的SQL
      @initSql varchar(8000),  --初始变量的SQL
      @SubsectionSQL varchar(8000),  --读取以4000分段后数据的SQL
      @CombinationSQL varchar(8000),  --分段后各个变量组合的SQL
      @EndFromSQL varchar(8000),  --组合的后辍(表名、分组列名)的SQL
      @i int,    --根据4000为分段迭代得到的i
      @ic varchar(50),   --转成字符串后的i
      @mc varchar(50)   --变量的个数


     EXEC('select ID=Identity(int,1,1),COL=''sum(case '+@col+' when

    ''''''+'+@col+'+'''''' then '+@content+' else 0 end) as ''''''+'+@col+'+'''''',''

    ,GID=0,Sort= '+@Sortfield+', SubSort = '+@SubSortfield+' into ##tmp from (select

    '+@col+'=replace('+@col+','''''''',''''''''''''),'+@Sortfield+','+@SubSortfield+' from

    '+@colTable+')a')

     SELECT @i=MAX(len(COL)) FROM ##tmp
     SET @i=4000/@i
     
     UPDATE ##tmp SET GID=ID/@i
     
     SELECT @i=MAX(GID),@mc=cast(@i AS varchar(50)) FROM ##tmp
     SELECT

    @declareSql='',@initSql='',@SubsectionSQL='',@CombinationSQL='',@EndFromSQL=''
     
     
     WHILE @i>=0
     BEGIN
      SELECT @ic=cast(@i AS varchar(50)),@i=@i-1,@declareSql='@'+@ic+' as

    varchar(4000),'+@declareSql,@initSql='@'+@ic+'='''','+@initSql,
      @SubsectionSQL='select @'+@ic+'=@'+@ic+'+COL from ##tmp where

    gid='''+@ic+''' order by Sort, SubSort '+char(13)

    +@SubsectionSQL,@CombinationSQL='@'+@ic+'+'+@CombinationSQL
     END
     
     SET @EndFromSQL=''' into ##CrossTable  from '+@table+' where '+@where+' group by

    '+@groupRow+''''
     SELECT @declareSql='declare '+left(@declareSql,len(@declareSql)-1)+char

    (13),@initSql='select '+left(@initSql,len(@initSql)-1)+char(13),@CombinationSQL=left

    (@CombinationSQL,len(@CombinationSQL)-1)
     EXEC(@declareSql+@initSql+@SubsectionSQL+
     'set @'+@mc+'=left(@'+@mc+',len(@'+@mc+')-1)'+
     'exec(''select '+@sumRow+',''+'+@CombinationSQL+'+'+@EndFromSQL+')'
     )

     EXEC('UPDATE ##CrossTable SET '+@showSum+' = ''总计'', '+@showSubtotal+' = null

    WHERE '+@showSum+' IS NULL ')

     SELECT * FROM ##CrossTable
     DROP TABLE ##tmp
     DROP TABLE ##CrossTable

     GO

  • 相关阅读:
    mybatis的分页插件pagehelper的使用
    SSM框架中添加事务
    junit测试,spring中使用
    maven的聚合和继承,maven的依赖
    shiro的角色和权限
    tomcat配置虚拟文件路径
    通过HttpServletRequest的request获取各种路径
    shiro学习一
    JDBC
    GUI
  • 原文地址:https://www.cnblogs.com/boundless/p/555638.html
Copyright © 2011-2022 走看看