设为首页 加入收藏

TOP

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)(二)
2015-11-21 01:40:19 来源: 作者: 【 】 浏览:1
Tags:SQL Server 动态 参数 分组 段值
============================== DECLARE @sql_str NVARCHAR(MAX) DECLARE @sql_col NVARCHAR(MAX) DECLARE @tableName SYSNAME --行转列表 DECLARE @groupColumn SYSNAME --分组字段 DECLARE @row2column SYSNAME --行变列的字段 DECLARE @row2columnValue SYSNAME --行变列值的字段 SET @tableName = 'TestRows2Columns' SET @groupColumn = 'UserName' SET @row2column = 'Subject' SET @row2columnValue = 'Source' --从行数据中获取可能存在的列 SET @sql_str = N' SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+']) FROM ['+@tableName+'] GROUP BY ['+@row2column+']' --PRINT @sql_str EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT --PRINT @sql_col SET @sql_str = N' SELECT * FROM ( SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt ORDER BY pvt.['+@groupColumn+']' --PRINT (@sql_str) EXEC (@sql_str)

?

?
?
(七) 在实际的运用中,我经常遇到需要对基础表的数据进行筛选后再进行行转列,那么下面的脚本将满足你这个需求,效果如图6所示:
?
--6:带条件查询的参数化动态PIVOT行转列
?
-- =============================================
?
-- Author: <听风吹雨>

-- Create date: <2014.05.26>

-- Description: <参数化动态PIVOT行转列,带条件查询的参数化动态PIVOT行转列>

-- Blog:

-- =============================================

DECLARE @sql_str NVARCHAR(MAX)

DECLARE @sql_col NVARCHAR(MAX)

DECLARE @sql_where NVARCHAR(MAX)

DECLARE @tableName SYSNAME --行转列表

DECLARE @groupColumn SYSNAME --分组字段

DECLARE @row2column SYSNAME --行变列的字段

DECLARE @row2columnValue SYSNAME --行变列值的字段

SET @tableName = 'TestRows2Columns'

SET @groupColumn = 'UserName'

SET @row2column = 'Subject'

SET @row2columnValue = 'Source'

SET @sql_where = 'WHERE UserName = ''王五'''

--从行数据中获取可能存在的列

SET @sql_str = N'

SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])

FROM ['+@tableName+'] '+@sql_where+' GROUP BY ['+@row2column+']'

--PRINT @sql_str

EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT

--PRINT @sql_col

SET @sql_str = N'

SELECT * FROM (

SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']'+@sql_where+') p PIVOT

(SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt

ORDER BY pvt.['+@groupColumn+']'

--PRINT (@sql_str)

EXEC (@sql_str)

?

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQL 中GO的作用 下一篇数据库的隔离级别

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: