我可能會誤解你的要求,但它聽起來像是你可以使用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