我可能会误解你的要求,但它听起来像是你可以使用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)
什么样的SQL?你只有向人们出售2件物品? – podiluska
SQL Server 2008.不,问题是,有时候,超过2人拥有相同的帐号。我找到的一个例子是具有相同帐号的8人。 – user1668123
@ user1668123你能提供这两个表的一些示例数据吗?或者更好的创建一个[SQL小提琴](http://sqlfiddle.com/)与工作数据模型 – Taryn