加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL实现动态交叉表

发布时间:2016-09-17 03:12:58 所属栏目:MsSql教程 来源:站长网
导读:动态交叉表就是列表可以根据表中数据的情况动态创建列。 动态查询不能使用Select语句实现,它可以利用存储过程实现。思路是: 首先检索列头信息,形成一个游标
动态交叉表就是列表可以根据表中数据的情况动态创建列。

动态查询不能使用Select语句实现,它可以利用存储过程实现。思路是:

首先检索列头信息,形成一个游标,然后遍历游标,将上面静态交叉表实现过程中使用Case语句判断的内容用游标里的值替代,形成一条新的Sql查询语句,然后执行并返回结果。下面是一个通用的实现动态交叉表的存储过程:

CREATE procedure proc_across_table
@TableName as varchar(50), --生成交叉表依据的表名
@NewColumn as varchar(50), --生成表头依据的字段名
@GroupColumn as varchar(50), --分组依据的字段名
@StatColumn as varchar(50), --欲统计的字段名
@Operator as varchar(10) --统计的运算方式
AS
DECLARE @SQL as varchar(1000), @Column as varchar(50) --定义参数
EXECUTE ('DECLARE cursor_new_column CURSOR FOR SELECT DISTINCT ' + @NewColumn + ' from ' + @TableName + ' for read only ') --定义游标
begin
SET nocount ON
SET @SQL='select ' + @GroupColumn + ', ' + @Operator + '(' + @StatColumn + ') AS [' + @Operator + ' of ' + @StatColumn + ']' --定义SQL语句头
OPEN cursor_new_column
while (0=0)
BEGIN --遍历游标
FETCH NEXT FROM cursor_new_column INTO @Column --通过游标获取列头信息
if (@@fetch_status<>0) break
SET @SQL = @SQL + ', ' + @Operator + '(CASE ' + @NewColumn + ' WHEN ''' + @Column + ''' THEN ' + @StatColumn + ' ELSE Null END) AS [' + @Column + ']' --循环追加SQL语句
END
SET @SQL = @SQL + ' from ' + @TableName + ' group by ' + @GroupColumn --定义SQL语句尾
EXECUTE(@SQL) --执行SQL语句
PRINT @SQL --输出SQL语句
IF @@error <>0 RETURN @@error --如果出错,则返回错误代码
CLOSE cursor_new_column --关闭游标
DEALLOCATE cursor_new_column RETURN 0 --释放游标,释放成功则返回0
end
GO

在SQL Server查询分析器上执行下面的代码,就可以得到动态交叉表。

proc_across_table '商品销售表', '订单号', '商品名', '订货数量', 'SUM'

 

在SQL Server查询分析器上调用存储过程时,最前面的为将要调用的存储过程的名称,后面为执行存储过程需要的参数,参数用引号括起,存储过程名称与参数之间用空格分隔,参数之间用逗号分隔。

说明:这是一个通用的存储过程,只要正确的传入生成交叉表依据的表名(@TableName)、生成表头依据的字段名(@NewColumn)、生成主键列依据的字段名(@GroupColumn)、欲统计的字段名(@StatColumn)和统计的运算方式(@Operator),就可以成功的将其应用到任何数据表中。

实现动态交叉表时用到了游标,下面对游标进行详细介绍。

每个游标有4个组成部分,这4个组成部分必须符合下面的顺序:

(1)声明游标;

(2)打开游标;

(3)从一个游标中查找信息;

(4)关闭游标。

其中,声明游标主要使用DECLARE CURSOR语句,下面介绍该语句。

语法:

DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

cursor_name:用于指定游标的名称。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读