动态交叉表就是列表可以根据表中数据的情况动态创建列。
动态查询不能使用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:用于指定游标的名称。 (编辑:滁州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|