SQL Server将一列拆分为多列

SQL Server将一列拆分为多列,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我试图将一列数据拆分为多列(必要时介于1和5之间),因为其他列中的数据相同。 这是一个查询后我的数据示例: FirstName LastName StreetName StreetNumber AccountNumber John Smith Fake St 123 10 John Smith Fake St 123 20 John

我试图将一列数据拆分为多列(必要时介于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个新列,任何空字段都是空值。有人能帮忙吗?

您可以使用简单的pivot:

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]