/******************************************* **过程名:[show_mftf] **输入参数:参数A **@JLNO:记录号 **输出: **功能描述:动态列转行 **作者: **更新:修改人xxx;修改日期xxxx **版本: ********************************************/ alter proc [dbo].[show_mftf] as begin DECLARE @sql_str NVARCHAR(MAX) DECLARE @sql_col NVARCHAR(MAX) DECLARE @tableName SYSNAME --行转列表 DECLARE @groupColumn SYSNAME --分组字段 DECLARE @row2column SYSNAME --行变列的字段 DECLARE @row2columnValue SYSNAME --行变列值的字段 SET @tableName = 'MC_TF_JXYDJY' SET @groupColumn = '记录号' SET @row2column = 'PROJECT' SET @row2columnValue = 'NUM' declare @recordNo varchar(30) set @recordNo='JL20181029008' --从行数据中获取可能存在的列 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 pvt.* FROM ( SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt where 记录号='''+@recordNo+'''' PRINT (@sql_str) EXEC (@sql_str) end
再来上两个效果图,图一是原数据:
图二是变换过后的数据:
补充一句:这个proc适用于单条,如果对于多条的话把传入的条件去掉
USE [MC_QMS] GO /****** Object: StoredProcedure [dbo].[show_mftf] Script Date: 11/14/2018 16:58:19 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /******************************************* **过程名:[show_mftf] **输入参数:参数A **@JLNO:记录号 **输出: **功能描述:动态列转行 **作者: **更新:修改人xxx;修改日期xxxx **版本: ********************************************/ ALTER proc [dbo].[show_mftf] as begin DECLARE @sql_str NVARCHAR(MAX) DECLARE @sql_col NVARCHAR(MAX) DECLARE @tableName SYSNAME --行转列表 DECLARE @groupColumn SYSNAME --分组字段 DECLARE @row2column SYSNAME --行变列的字段 DECLARE @row2columnValue SYSNAME --行变列值的字段 SET @tableName = 'MC_TF_JXYDJY' SET @groupColumn = '记录号' SET @row2column = 'PROJECT' SET @row2columnValue = 'NUM' --从行数据中获取可能存在的列 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 pvt.* FROM ( SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt ' --print @sql_str EXEC sp_executesql @sql_str end
然后显示出来的结果:
显示全部时候:这个动态是对一个表中的行要相同的,因为不相同的话,查出来的数据的列就会被第一条数据的列名占用,然后值用null填充了。
如果用一个表的内部项目不同的话,就要分开显示了,前面用标识区分,这样就能显示对应的项目了。