Sql server 使用SQL Server将行数据转换为列数据

Sql server 使用SQL Server将行数据转换为列数据,sql-server,Sql Server,我想将行数据转换为列,其中列名不是来自数据。我认为使用Pivot不会给我正确的解决方案。请查看我的数据的外观以及我希望它的外观 示例中返回的行数将随着时间的推移继续增加 我的解决方案: 基于@Triv Answeed,我已经设法解决了这个问题,使用rank函数创建了一个新列,然后使用dynamic pivot SQL转换数据。您可以使用dynamic SQL+ 演示链接: 注意:CONCAT在sql server 2012+中可用。如果您使用的是较旧的版本,那么使用+来连接字符串如果有效,请检

我想将行数据转换为列,其中列名不是来自数据。我认为使用Pivot不会给我正确的解决方案。请查看我的数据的外观以及我希望它的外观

示例中返回的行数将随着时间的推移继续增加

我的解决方案
基于@Triv Answeed,我已经设法解决了这个问题,使用rank函数创建了一个新列,然后使用dynamic pivot SQL转换数据。

您可以使用dynamic SQL+

演示链接:


注意:
CONCAT
在sql server 2012+中可用。如果您使用的是较旧的版本,那么使用
+
来连接字符串

如果有效,请检查此项,而不是@testTable使用您的表名

 declare @temptable varchar(1000) = 'declare @tempTable1 table (',

@inserStatement varchar(1000) = 'insert into @tempTable1 (',

@insertValues varchar(1000) = ''

DECLARE @AcountNumber VARCHAR(50),@Product varchar(40),@ProductEndData varchar(50), @increment int = 0;

DECLARE db_cursor CURSOR FOR  
select 
Product,
ProductEndData from @testTable  

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @Product, @ProductEndData 

WHILE @@FETCH_STATUS = 0   
BEGIN   
set @increment = @increment+1;
       SET @temptable += 'Product'+ cast(@increment as varchar) +' varchar(100),' + 'Product' + cast(@increment as varchar) + 'EndDate varchar(100),' ;
        set @inserStatement += 'Product'+ cast(@increment as varchar) +',' + 'Product' + cast(@increment as varchar) + 'EndDate,';

      set @insertValues += '(''' + @Product +''''+ ',' + ''''+ @ProductEndData + '''' + ')';


       FETCH NEXT FROM db_cursor INTO  @Product, @ProductEndData   

END   

CLOSE db_cursor   
DEALLOCATE db_cursor

set @temptable = STUFF(@temptable, LEN(@temptable), 1, ')')
set  @inserStatement = STUFF(@inserStatement, LEN(@inserStatement), 1, ')')
set @insertValues = replace(@insertValues, ')(', ',')
exec (@temptable + @inserStatement + ' values ' +  @insertValues + 'select * from @tempTable1')

我想你需要一个动态sql查询。对不起,我对sql很陌生,不知道怎么做。请共享sql以便执行此操作?您的sql server版本?
 declare @temptable varchar(1000) = 'declare @tempTable1 table (',

@inserStatement varchar(1000) = 'insert into @tempTable1 (',

@insertValues varchar(1000) = ''

DECLARE @AcountNumber VARCHAR(50),@Product varchar(40),@ProductEndData varchar(50), @increment int = 0;

DECLARE db_cursor CURSOR FOR  
select 
Product,
ProductEndData from @testTable  

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @Product, @ProductEndData 

WHILE @@FETCH_STATUS = 0   
BEGIN   
set @increment = @increment+1;
       SET @temptable += 'Product'+ cast(@increment as varchar) +' varchar(100),' + 'Product' + cast(@increment as varchar) + 'EndDate varchar(100),' ;
        set @inserStatement += 'Product'+ cast(@increment as varchar) +',' + 'Product' + cast(@increment as varchar) + 'EndDate,';

      set @insertValues += '(''' + @Product +''''+ ',' + ''''+ @ProductEndData + '''' + ')';


       FETCH NEXT FROM db_cursor INTO  @Product, @ProductEndData   

END   

CLOSE db_cursor   
DEALLOCATE db_cursor

set @temptable = STUFF(@temptable, LEN(@temptable), 1, ')')
set  @inserStatement = STUFF(@inserStatement, LEN(@inserStatement), 1, ')')
set @insertValues = replace(@insertValues, ')(', ',')
exec (@temptable + @inserStatement + ' values ' +  @insertValues + 'select * from @tempTable1')