通用动态交叉表的实现

原创 2006年05月25日 15:01:00

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

create              PROCEDURE usp_Crosstab
 @table varchar(50),   --表名
 @sumRow varchar(8000),  --合计列字段
 @groupRow varchar(1000),  --分组列字段
 @col varchar(50),   --要将列值转换为列的列字段
 @colTable varchar(1000), --要将列值转换为列的列字段表
 @Sortfield 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+' into ##tmp from (select '+@col+'=replace('+@col+','''''''',''''''''''''),'+@Sortfield+' 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 '+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

sqlserver 交叉表通用存储

  • 2011年03月22日 15:55
  • 2KB
  • 下载

mysql交叉表,行列动态转换

工作内容 jbpm6 方向 2014-6-22 18:09 |个人分类:工作内容| jbpm 之前研究的jbpm6全是基于web的外壳,这是皮,可以进一步研究调用jbpm内核的api。 ...

C#动态交叉表查询

  • 2013年07月31日 21:27
  • 309KB
  • 下载

birt API 动态创建交叉表

  • 2011年12月20日 16:13
  • 4KB
  • 下载

Android社交类APP动态详情代码实现通用模板

 Android社交类APP动态详情代码实现通用模板 Android平台上一些比较流行的社交类APP比如微信、陌陌等,都有动态详情页,在该页面,用户发表的动态详情,好友可以发起评论、点赞等...

Spring JdbcTemplate实现通用的泛型dao三:构建动态sql

构建动态sql,其实说白了就是拼装sql语句,在这里我把传入的实体参数,属性有值的拼装进sql,为null的则忽略,要实现这个不用说,肯定要利用Java的反射功能,来看一个具有代表性的insert语句...

c语言实现一个简单的通用动态数组

背景 最近在看《系统程序员成长计划》,里面有个任务是实现一个动态数组,所以我用以前学过的知识实现了一个通用的动态数组,不过暂时只能存放int,char,double,字符串的还没实现。 设计与实现 一...

动态代理的实现2-编写可生成代理和插入通告的通用方法 .

//一个通告或建议的接口 public interface Advice { void afterMethod(Method method); void beforeMethod(Metho...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通用动态交叉表的实现
举报原因:
原因补充:

(最多只允许输入30个字)