2014-01-23 4 views
0

У меня есть таблицы, называемые клиентами, хобби. У клиента есть несколько хобби. Так что, если я присоединюсь к моему столику клиента с таблицей хобби я получаю результат, как:sql преобразовать строки в столбцы в sql server 2008r2

[CustomerName] [HobbyName] 
Harry    Tennis 
Harry    Football 

То, что я хотел бы, чтобы увидеть результат, как этот:

[CustomerName] [HobbyName1] [HobbyName2] 
Harry    Tennis   Football 

Мой текущий запрос выглядит следующим образом:

Select tCustomer.name, tHobby.name 
    from dbo.customer tCustomer 
    inner join dbo.hobby tHobby on tHobby.customerid = tCustomer.id 
+4

Вы можете посмотреть Pivot. – Zane

+0

Требуется ли преобразование в отношения «один к одному», или вы просто хотите получить группу хобби для каждого имени клиента? – Codeman

+0

Что, если у Гарри есть другое увлечение? – Tom

ответ

6

вы не предоставили много подробностей о вашей структуре таблицы, но вы можете использовать PIVOT, чтобы получить конечный результат, но для того, чтобы использовать это, вы будете первым хотите использовать row_number() для создания уникального sequ ENCE для каждого хобби каждого клиента:

select customer, Hobby1, Hobby2 
from 
(
    Select c.name customer, 
    h.name hobby, 
    'Hobby'+ 
     cast(row_number() over(partition by c.id 
          order by h.name) as varchar(10)) seq 
    from dbo.customer c 
    inner join dbo.hobby h 
    on h.customerid = c.id 
) d 
pivot 
(
    max(hobby) 
    for seq in (hobby1, Hobby2) 
) piv; 

См SQL Fiddle with Demo. Если вы не хотите использовать функцию Pivot, то вы можете также использовать выражение CASE, и агрегатную функцию:

select customer, 
    max(case when seq = 1 then hobby end) hobby1, 
    max(case when seq = 2 then hobby end) hobby2 
from 
(
    Select c.name customer, 
    h.name hobby, 
    row_number() over(partition by c.id 
         order by h.name) seq 
    from dbo.customer c 
    inner join dbo.hobby h 
    on h.customerid = c.id 
) d 
group by customer; 

См SQL Fiddle with Demo

+0

wow thx Я выбрал метод с выражением CASE. Спасибо, что разрешили это для меня. – user717316

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