2012-02-01 12 views
0

結合我有一個表稱爲員工具有以下字段TSQL -Eliminating重複從ResultSet和他們在一個單行

 
Id | Name  | PrimaryEmail1 | PrimaryEmail2 | PrimaryEmail3 
1 | JonSkeet | NULL   | NULL   | [email protected] 
1 | JonSkeet | NULL   | [email protected] | [email protected] 
1 | JonSkeet | [email protected] | NULL   | [email protected] 
2 | George | [email protected] | NULL   | NULL 
2 | George | NULL   | [email protected] | NULL 
2 | George | NULL   | NULL   | [email protected] 

如何寫一個TSQL查詢,這樣我可以得到下面的結果集?

 
Id | Name  | PrimaryEmail1 | PrimaryEmail2 | PrimaryEmail3 
1 | JonSkeet | [email protected] | [email protected] | [email protected] 
2 | George | [email protected] | [email protected] | [email protected] 
+1

是你有什麼不同的值PrimaryEmail3爲JonSkeet? – gbn 2012-02-01 12:47:35

回答

5

MAX將消除空值

SELECT 
    ID, Name, 
    MAX(PrimaryEmail1) AS PrimaryEmail1, 
    MAX(PrimaryEmail2) AS PrimaryEmail2, 
    MAX(PrimaryEmail3) AS PrimaryEmail3 
FROM 
    employee 
GROUP BY 
    ID, Name 

但是,你的JonSkeet例子顯示PrimaryEmail3是一樣的。你會期望每個ID +名稱有不同的值嗎?如果是這樣,除非您選擇最大值(或最小值),否則不能合併成一行。

這是假設的Id-Name對過於一致

+0

是的,我從你的查詢得到了預期的結果。謝謝。我無法編輯我的問題,因爲它顯示了一些格式錯誤。再次感謝。 – user992910 2012-02-01 13:07:59

0

下面的腳本將串連所有唯一的非NULL電子郵件到一個列表,分別對每列:

; 
WITH employee (Id, Name, PrimaryEmail1, PrimaryEmail2, PrimaryEmail3) AS (
    SELECT 1, 'JonSkeet', NULL   , NULL   , '[email protected]' UNION ALL 
    SELECT 1, 'JonSkeet', NULL   , '[email protected]', '[email protected]' UNION ALL 
    SELECT 1, 'JonSkeet', '[email protected]', NULL   , '[email protected]' UNION ALL 
    SELECT 2, 'George' , '[email protected]' , NULL   , NULL UNION ALL 
    SELECT 2, 'George' , NULL   , '[email protected]' , NULL UNION ALL 
    SELECT 2, 'George' , NULL   , NULL   , '[email protected]' 
) 

SELECT 
    Id, 
    Name, 
    PrimaryEmail1 = SUBSTRING(
    (SELECT DISTINCT ', ' + PrimaryEmail1 FROM employee WHERE Id = e.Id FOR XML PATH ('')), 
    3, 
    999999 
), 
    PrimaryEmail2 = SUBSTRING(
    (SELECT DISTINCT ', ' + PrimaryEmail2 FROM employee WHERE Id = e.Id FOR XML PATH ('')), 
    3, 
    999999 
), 
    PrimaryEmail3 = SUBSTRING(
    (SELECT DISTINCT ', ' + PrimaryEmail3 FROM employee WHERE Id = e.Id FOR XML PATH ('')), 
    3, 
    999999 
) 
FROM employee e 
GROUP BY Id, Name 

如果有永遠不能在同一名員工的三個PrimaryEmail列中的任何一列中都有不同的非空值,您將得到與MINMAX相同的結果。否則,你會得到所有的不同值的列表,上面的腳本

結果:

Id Name  PrimaryEmail1 PrimaryEmail2 PrimaryEmail3  
-- -------- -------------- ------------- ----------------- 
1 JonSkeet [email protected] [email protected] [email protected] 
2 George [email protected] [email protected] [email protected]