2013-01-11 30 views
0

我需要一些SQL查詢的幫助。我有兩個表和ENDPOINT。對於每個用戶,在ENDPOINT表中例如定義了3行。在SQL Server查詢中多次顯示一列

USER ENDPOINT  ENDPOINTTYPE 
123 123456  HomePhone 
123 456789  CellPhone 
123 [email protected] Email 

我想在單行顯示這些數據,例如

USER HomePhone CellPhone Email 

你能告訴我一個方法來達到這個目的嗎?

非常感謝!

+0

任何鏈接到以前的職位嗎?我試圖搜索,但沒有找到匹配的帖子。 – user1229404

+1

您也可以考慮在表示層執行此操作,而不是強制SQL Server執行此操作。 –

+0

我今天早些時候回答了這個問題,如果我沒有錯誤 – Woot4Moo

回答

2

嘗試是這樣的:

SELECT 
    U.[User], 
    EP1.EndPoint as 'HomeEndpoint', EP1.Endpotintype as 'HomeEndpointType', 
    EP2.EndPoint as 'CellEndpoint', EP2.Endpotintype as 'CellEndpointType', 
    EP3.EndPoint as 'EmailEndpoint', EP3.Endpotintype as 'EmailEndpointType' 
FROM Users U 
    LEFT JOIN EndPoint EP1 ON U.[User] = EP1.[User] AND EP1.EndPointType = 'HomePhone' 
    LEFT JOIN EndPoint EP2 ON U.[User] = EP2.[User] AND EP2.EndPointType = 'CellPhone' 
    LEFT JOIN EndPoint EP3 ON U.[User] = EP3.[User] AND EP3.EndPointType = 'Email' 

還是要回到剛纔的4列:

SELECT 
    U.[User], 
    EP1.EndPoint as 'Home Phone', 
    EP2.EndPoint as 'Cell Phone', 
    EP3.EndPoint as 'Email' 
FROM Users U 
    LEFT JOIN EndPoint EP1 ON U.[User] = EP1.[User] AND EP1.EndPointType = 'HomePhone' 
    LEFT JOIN EndPoint EP2 ON U.[User] = EP2.[User] AND EP2.EndPointType = 'CellPhone' 
    LEFT JOIN EndPoint EP3 ON U.[User] = EP3.[User] AND EP3.EndPointType = 'Email' 

這裏是SQL Fiddle - 注意,我換柱用戶到用戶id,因爲它是一個保留字(或者你可以使用括號)。

+0

感謝您的幫助!這是我需要的。 如何篩選空記錄?我試過使用EP1.EndPoint IS NOT NULL,但這並沒有工作.. 對不起,我是一個完整的新手到SQL世界:( – user1229404

+0

那麼,你想顯示如果家庭電話爲空,但手機有一個值? –

+0

如果HomePhone爲空,我不會顯示結果 – user1229404

4

這種類型的數據轉換被稱爲樞軸。 SQL Server有啓動與SQL Server 2005

之前到SQL Server 2005中的旋轉功能,這可以使用聚合函數與CASE表達來完成:

select [user], 
    max(case when ENDPOINTTYPE = 'HomePhone' then EndPoint end) HomePhone, 
    max(case when ENDPOINTTYPE = 'CellPhone' then EndPoint end) CellPhone, 
    max(case when ENDPOINTTYPE = 'Email' then EndPoint end) Email 
from yourtable 
group by [user]; 

SQL Fiddle with Demo

如果您正在使用SQL Server 2005+,然後轉動查詢看起來像:

select * 
from 
(
    select [user], endpoint, endpointtype 
    from yourtable 
) src 
pivot 
(
    max(endpoint) 
    for endpointtype in (HomePhone, CellPhone, Email) 
) piv 

SQL Fiddle with Demo

上述查詢工作的偉大,如果你提前知道時間的價值。如果你沒有,那麼你將要使用動態SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ENDPOINTTYPE) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT [USER],' + @cols + ' from 
      (
       select [USER], [ENDPOINT], [ENDPOINTTYPE] 
       from yourtable 
      ) x 
      pivot 
      (
       max(ENDPOINT) 
       for ENDPOINTTYPE in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

所有的查詢返回相同的結果:

| USER | HOMEPHONE | CELLPHONE |  EMAIL | 
---------------------------------------------- 
| 123 | 123456 | 456789 | [email protected] | 
+0

@AarBeBerand感謝您的編輯 – Taryn

+0

非常歡迎我寧願處理編輯,而不是編寫所有這些$ ^#&@ pivot查詢。:-) –

+0

非常感謝您的幫助。不知道關於sql小提琴。這是一個很好的工具。 – user1229404