2014-04-17 37 views
0

我正在爲我的web應用程序創建一些視圖。我有單獨的表格將我的電子郵件和電話表管理到我的員工表中。我試圖查看是否有一種方法可以在大量相同信息來自同一個表時將這些表中的大量連接減少爲單個數據透視表。通過使用數據透視來減少連接?

我的查詢:

SELECT * 
FROM (SELECT emp.[first_name] as [First Name] 
     ,emp.[last_name] as [Last Name] 
     ,emp.[birth_day] as [Birthday] 
     ,emp.[gender] as [Gender] 
     ,emp.[address_line_1] as [Address] 
     ,emp.[address_line_2] as [Apt/Suite #] 
     ,emp.[city] AS [City] 
     ,emp.[state] AS [State] 
     ,emp.[zip] AS [Zip Code] 
     ,phone1.[Home Phone Number] 
     ,phone2.[Work Phone Number] 
     ,phone3.[Mobile Phone Number] 
     ,email1.[Primary Email] 
     ,email2.[Secondary Email] 
     ,email3.[Personal Email] 

    FROM [employee].[employees] emp 
LEFT JOIN 
    ( 
    SELECT TOP 1 [phone_number] AS [Home Phone Number] 
     ,[employee_id] 
    FROM [employee].[phone_manager] 
    WHERE ([phone_type] = '1') 
    ORDER BY [date_added] DESC 
    ) phone1 ON phone1.employee_id = emp.employee_id 
LEFT JOIN 
    ( 
    SELECT TOP 1 [phone_number] AS [Work Phone Number] 
     ,[employee_id] 
    FROM [employee].[phone_manager] 
    WHERE ([phone_type] = '2') 
    ORDER BY [date_added] DESC 
    ) phone2 ON phone2.employee_id = emp.employee_id 
LEFT JOIN 
    ( 
    SELECT TOP 1 [phone_number] AS [Mobile Phone Number] 
     ,[employee_id] 
    FROM [employee].[phone_manager] 
    WHERE ([phone_type] = '3') 
    ORDER BY [date_added] DESC 
    ) phone3 ON phone3.employee_id = emp.employee_id 
LEFT JOIN 
    ( 
    SELECT TOP 1 [email] AS [Primary Email] 
     ,[employee_id] 
    FROM [employee].[email_manager] 
    WHERE ([email_type] = '1') 
    ORDER BY [date_added] DESC 
    ) email1 ON email1.employee_id = emp.employee_id 
LEFT JOIN 
    ( 
    SELECT TOP 1 [email] AS [Secondary Email] 
     ,[employee_id] 
    FROM [employee].[email_manager] 
    WHERE ([email_type] = '2') 
    ORDER BY [date_added] DESC 
    ) email2 ON email2.employee_id = emp.employee_id 
LEFT JOIN 
    ( 
    SELECT TOP 1 [email] AS [Personal Email] 
     ,[employee_id] 
    FROM [employee].[email_manager] 
    WHERE ([email_type] = '3') 
    ORDER BY [date_added] DESC 
    ) email3 ON email3.employee_id = emp.employee_id 
) pvt 

回答

2

你可以做你想做的,每個 「經理」 表中,通過使用row_number()group by。這裏是一個電話號碼的例子:

SELECT employee_id, 
     MAX(CASE WHEN seqnum = 1 and phone_type = 1 THEN phone_number END) as Home, 
     MAX(CASE WHEN seqnum = 1 and phone_type = 2 THEN phone_number END) as Work, 
     MAX(CASE WHEN seqnum = 1 and phone_type = 3 THEN phone_number END) as Mobile 
FROM (SELECT employee_id, phone_number, 
      row_number() over (partition by phone_type order by date_added desc) as seqnum 
     FROM employee.phone_manager 
    ) ep 
GROUP BY employee_id; 
+0

我也有一個名爲phone_types分別與字段ID和名稱的表。當ID匹配時,我可以通過名稱字段獲取列名稱嗎? –

+0

@Jdsfighter。 。 。您可以輕鬆地爲固定的電話類型設置 - 只需加入表格並在「WHEN」條款中更改條件即可。如果您需要可變數量的列,那麼這是一個需要動態SQL的問題。 –