2013-11-01 62 views
3

我想基于其他列中的数据是相同的,将一列数据分成多个(在必要的情况下为1到5之间)。
这是我的数据的查询之后的示例:SQL Server将一列分成多列

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值。谁能帮忙?

回答

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

+0

谢谢你的快速和正确的反应! – Jason