2013-11-01 8 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

Смежные вопросы