动态行转列问题。需要自提,改吧改吧就行了

/*******************************************
**过程名:[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填充了。

 如果用一个表的内部项目不同的话,就要分开显示了,前面用标识区分,这样就能显示对应的项目了。
**********初心不改,方得始终。
原文地址:https://www.cnblogs.com/salv/p/9929445.html