虽然M.Ali's answer将让你的结果,因为你使用的是SQL Server 2012中我会逆转置的name
和address
柱略有不同,以获得最终结果。
由于您使用的是SQL Server 2012,因此您可以使用CROSS APPLY
和VALUES
将这些多列反转为多行。但在你这样做之前,我会用row_number()
来得到新的列的总数。
代码为 “UNPIVOT” 数据使用CROSS APPLY的样子:
select d.loanid,
col = c.col + cast(seq as varchar(10)),
c.value
from
(
select loanid, name, address,
row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
values
('name', name),
('address', address)
) c(col, value);
见SQL Fiddle with Demo。这将让您的数据为类似的格式:
| LOANID | COL | VALUE |
|--------|----------|----------|
| 1 | name1 | John |
| 1 | address1 | New York |
| 1 | name2 | Carl |
| 1 | address2 | New York |
| 1 | name3 | Henry |
| 1 | address3 | Boston |
你现在有一列COL
与所有新的列名和关联的值也是一列。根据每个loanid
有多少个总条目,新列名现在在最后有一个数字(1,2,3等)。现在您可以套用PIVOT:
select loanid,
name1, address1, name2, address2,
name3, address3
from
(
select d.loanid,
col = c.col + cast(seq as varchar(10)),
c.value
from
(
select loanid, name, address,
row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
values
('name', name),
('address', address)
) c(col, value)
) src
pivot
(
max(value)
for col in (name1, address1, name2, address2,
name3, address3)
) piv;
请参阅SQL Fiddle with Demo。最后,如果你不知道有多少双Name
和Address
你会有那么你可以使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10)))
from
(
select row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
select 'Name', 1 union all
select 'Address', 2
) c (col, so)
group by seq, col, so
order by seq, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT loanid,' + @cols + '
from
(
select d.loanid,
col = c.col + cast(seq as varchar(10)),
c.value
from
(
select loanid, name, address,
row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
values
(''name'', name),
(''address'', address)
) c(col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '
exec sp_executesql @query;
见SQL Fiddle with Demo。两个版本都给出了结果:
| LOANID | NAME1 | ADDRESS1 | NAME2 | ADDRESS2 | NAME3 | ADDRESS3 |
|--------|--------|----------|--------|----------|--------|----------|
| 1 | John | New York | Carl | New York | Henry | Boston |
| 2 | Robert | Chicago | (null) | (null) | (null) | (null) |
| 3 | Joanne | LA | Chris | LA | (null) | (null) |
是否每个'name' /'地址'都需要是单独的列吗?它们可以是一列中的逗号分隔列表吗?你还使用了什么RDBMS? – Brad
布拉德,我已经提到它 - SQL Server 2012.名称/地址可以用逗号分隔。 –
http://stackoverflow.com/questions/5196371/sql-query-concatenating-results-into-one-string – Brad