Sql server 在SQL Server中将行的重复值移动到列

Sql server 在SQL Server中将行的重复值移动到列,sql-server,Sql Server,我有一个包含以下示例数据的表: Name Value ----------------------- Year 1990 Year 1991 Year 1992 Cash 2000 Cash 4000 Cash 6000 Tax Paid Tax Unpaid Tax Pe

我有一个包含以下示例数据的表:

Name            Value
-----------------------
Year            1990
Year            1991
Year            1992
Cash            2000
Cash            4000
Cash            6000
Tax             Paid
Tax             Unpaid
Tax             Pending
Liability       3500
Liability       8500
Liability       9500
我需要以下格式的数据:

Name            Value1        Value2        Value3
-----------------------------------------------------
Year            1990          1991          1992
Cash            2000          4000          6000
Tax             Paid          Unpaid        Pending
Liability       3500          8500          9500
请注意,结果表中的列数应该是动态的,即值列数=原始表中某项的记录数

在本例中,每个项都有3条记录,因此结果表中将有3个值列

请导游

更新:

我使用了下面的查询,它以正确的格式返回数据,但仍然不知道如何识别结果表中的列数。在下面的示例中,固定了5列(名称、值1、值2、值3、值4)


你试过什么吗???如果有4行或5行呢?10美元是多少?最多是3个吗?你的尝试中有什么不起作用?这是否回答了你的问题?Hi@Larnu,行数不固定。它可以是4、5或10。我想,Pivot不会有帮助,因为我们不必将所有的“名称”转换为列,而是将“值”转换为列。然后,您需要一个动态Pivot,这里有100个if示例,以此类推。
with cte as
(
 select name ci,value,
        row_number() over(partition by [name] order by value) as rn
 from TABLE
)
select distinct ci as [name],
       (select ct.value from cte ct where ct.ci=cte.ci and ct.rn=1) value1,
       (select ct.value from cte ct where ct.ci=cte.ci and ct.rn=2) value2,
       (select ct.value from cte ct where ct.ci=cte.ci and ct.rn=3) value3,
       (select ct.value from cte ct where ct.ci=cte.ci and ct.rn=4) value4
from cte
create table #t
(
Name varchar(50),
Value varchar(50)
)
insert into #t(Name, Value)
values
('Year', '1990'),
('Year', '1991'),
('Year', '1992'),
('Cash', '2000'),
('Cash', '4000'),
('Cash', '6000'),
('Tax', ' Paid'),
('Tax', ' Unpaid'),
('Tax', ' Pending'),
('Liability', '3500'),
('Liability', '8500'),
('Liability', '9500'),
('Liability', '1500'),
('Liability', '2500'),
('Liability', '4500');


declare @sql nvarchar(max) = stuff(
(
select ',[value'+cast(rownum as varchar(20))+']'
from
(
select top((select max(cnt) from (select count(*) as cnt from #t group by Name) as t)) row_number() over(order by a.v) as rownum
from 
(
values(cast(null as bit)),(null),(null),(null),(null),(null),(null),(null),(null),(null)
) as a(v)
cross join
(
values(cast(null as bit)),(null),(null),(null),(null),(null),(null),(null),(null),(null)
) as b(v)
cross join
(
values(cast(null as bit)),(null),(null),(null),(null),(null),(null),(null),(null),(null)
) as c(v)
) as nums
order by rownum
for xml path('')), 1, 1, N'');

select @sql = N'
select *
from
(
select *, ''value''+cast(row_number() over(partition by Name order by (select null)) as varchar(20)) as colname
from #t
) as t
pivot
(
max(value) for colname in (' + @sql + N')
) as unpv
';

exec(@sql);

--
drop table #t;