我正在尝试根据其他列中相同的数据将一列数据拆分为多个(必要时在1到5之间)。
这是查询后我的数据示例:
FirstName LastName StreetName StreetNumber AccountNumber
John Smith Fake St 123 10
John Smith Fake St 123 20
John Smith Fake St 123 30
John Smith Fake St 123 40
这是基于同一地址的同一个人可以拥有多个帐户的事实,最多可达5个帐户。
FirstName LastName StreetName StreetNumber AccountNumber1 AccountNumber2 AccountNumber3 AccountNumber4 AccountNumber5
John Smith Fake St 123 10 20 30 40 NULL
因此,我需要根据名称/地址相同的条件将accountNumber列拆分为多个列。我想只创建5个新列,任何空字段都是NULL值。有人可以帮忙吗?
答案 0 :(得分:4)
你可以使用简单的支点:
with cte as (
select
*,
'AccountNumber' +
cast(
row_number()
over(
partition by [FirstName], [LastName], [StreetName], [StreetNumber]
order by AccountNumber
)
as nvarchar(max)) as rn
from Table1
)
select *
from cte
pivot (
max(AccountNumber)
for rn in (
[AccountNumber1],
[AccountNumber2],
[AccountNumber3],
[AccountNumber4],
[AccountNumber5]
)
) as p;
或者您可以手动转动:
with cte as (
select
*,
row_number()
over(
partition by [FirstName], [LastName], [StreetName], [StreetNumber]
order by AccountNumber
) as rn
from Table1
)
select
[FirstName], [LastName], [StreetName], [StreetNumber],
max(case when rn = 1 then AccountNumber end) as AccountNumber1,
max(case when rn = 2 then AccountNumber end) as AccountNumber2,
max(case when rn = 3 then AccountNumber end) as AccountNumber3,
max(case when rn = 4 then AccountNumber end) as AccountNumber4,
max(case when rn = 5 then AccountNumber end) as AccountNumber5
from cte
group by [FirstName], [LastName], [StreetName], [StreetNumber]
<强> sql fiddle demo 强>