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