2014-01-23 2 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 기능을 사용하지 않으려면, 당신은 또한 CASE 표현식과 집계 함수를 사용할 수 있습니다. – Zane

+0

일대일 관계로 변환해야합니까, 아니면 각 CustomerName에 대한 취미 그룹을 찾고 있습니까? – Codeman

+0

해리가 다른 취미가 있다면? – Tom

답변

6

당신은 당신의 테이블 구조에 많은 정보를 제공하지 않았다하지만 최종 결과를 얻을 수 PIVOT을 사용할 수 있지만, 이것을 사용하기 위해서는 먼저 고유 sequ를 생성하는 row_number()를 사용하는 것이 좋습니다 고객 당 취미 당 비용 :

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을 참조하십시오.

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

와우 thx CASE 표현식을 사용하여 메소드를 선택했습니다. 이 문제를 해결해 주셔서 감사합니다. – user717316

관련 문제