我可能会误解您的要求,但听起来您可以使用该UNPIVOT/PIVOT
功能来获得所需的结果。
如果您知道要转换的列数,那么您可以硬编码它的静态版本。
select *
from
(
select AccNo,
val,
col + cast(rn as varchar(10)) Col_Name
from
(
select p1.accno,
p1.name,
p1.itemid,
i1.id,
i1.i_name,
row_number() over(partition by accno order by name) rn
from persons p1
left join items i1
on p1.itemid = i1.id
) x
unpivot
(
val
for col in (name, i_name)
) u
) x1
pivot
(
max(val)
for col_name in ([name1], [i_name1], [name2], [i_name2])
) p
但听起来您将有未知数量的项目转换为列,因此您可以使用动态 SQL 并创建一个动态版本:
DECLARE @colsUnPivot AS NVARCHAR(MAX),
@colsPivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET @colsUnPivot = stuff((select ','+C.name
from sys.columns as C
where (C.object_id = object_id('persons')
or C.object_id = object_id('items'))
and C.name like '%name%'
for xml path('')), 1, 1, '')
select @colsPivot = STUFF((SELECT ','
+ quotename(c.name
+ cast(p.rn as varchar(10)))
from
(
select row_number() over(partition by accno order by name) rn
from persons
) p
cross apply
sys.columns as C
where (C.object_id = object_id('persons')
or C.object_id = object_id('items'))
and C.name like '%name%'
group by c.name, p.rn
order by p.rn, c.name desc
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select *
from
(
select AccNo,
val,
col + cast(rn as varchar(10)) Col_Name
from
(
select p1.accno,
p1.name,
p1.itemid,
i1.id,
i1.i_name,
row_number() over(partition by accno order by name) rn
from persons p1
left join items i1
on p1.itemid = i1.id
) x
unpivot
(
val
for col in ('+ @colsunpivot +')
) u
) x1
pivot
(
max(val)
for col_name in ('+ @colsPivot + ')
)p'
exec(@query)