2014-01-23 112 views
0

我有一張名爲customer,hobby's的表。 一位顧客有幾個愛好。所以,如果我和我的表客戶提供表的愛好,我得到的結果一樣: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

您可能要查找樞紐。 – Zane

+0

是否需要將其轉換爲一對一的關係,或者您是否希望爲每個客戶名稱獲得一組業餘愛好? – Codeman

+0

如果Harry有另一個愛好,該怎麼辦? – Tom

回答

6

您沒有提供很多細節上你的表結構,但你可以使用PIVOT得到最終的結果,但爲了使用這個你首先要使用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。如果你不想使用旋轉功能,那麼你也可以使用一個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

我選擇了CASE表達式的方法。謝謝你爲我解決這個問題。 – user717316