2014-11-06 103 views
1

假設我有下面的示例數據集:如何改善這4個自我加入?

emplid | Citizenship | 
100001 | USA   | 
100001 | CAN   | 
100001 | CHN   | 
100002 | USA   | 
100002 | CHN   | 
100003 | USA   | 

我想安排它要爲每個員工的國籍一行。我們可以假設一名員工擁有多達四個國籍。輸出應該是這樣的:

emplid | Citizeship_1 | Citizenship_2 | Citizenship_3 
100001 | USA   | CHN   | CAN 
100002 | USA   | CHN   | 
100003 | USA   |    | 

唯一可行的解​​決方案我已經能夠做到這一點是:由於數據集的增長和增長這變得越來越低效

SELECT e.emplid, MAX(e.citizenship) AS citizenship1, 
       MAX(e1.citizenship) AS citizenship2, 
       MAX(e2.citizenship) AS citizenship3, 
       MAX(e3.citizenship) AS citizenship4 
FROM employee e 
LEFT JOIN employee e1 ON e1.emplid = e.emplid AND e1.citizenship < e.citizenship 
LEFT JOIN employee e2 ON e2.emplid = e1.emplid AND e2.citizenship < e1.citizenship 
LEFT JOIN employee e3 ON e3.emplid = e2.emplid AND e3.citizenship < e2.citizenship 
GROUP BY e.emplid 

,但我找不到重寫此查詢的方法。

回答

1

爲什麼不把公民資格列入清單?

select e.emplid, group_concat(citizenship) as citizenships 
from employee e 
group by e.emplid; 

如果你想有四個單獨的列,你可以這樣做:

select e.emplid, 
     substring_index(group_concat(citizenship), ',', 1) as c1, 
     (case when count(*) >= 2 
      then substring_index(substring_index(group_concat(citizenship), ',', 2), ',', -1) 
     end) as c2, 
     (case when count(*) >= 3 
      then substring_index(substring_index(group_concat(citizenship), ',', 3), ',', -1) 
     end) as c3, 
     (case when count(*) >= 4 
      then substring_index(substring_index(group_concat(citizenship), ',', 4), ',', -1) 
     end) as c4 
from employee e 
group by e.emplid; 
+0

第一個查詢將在國籍中給逗號分隔值,他必須將值分開使用,如他所願。更好,最好的方法。 – 2014-11-06 18:29:56

+0

第一個確實運行得更快,但第二個告訴我substring_index的參數值不正確。 [小提琴](http://sqlfiddle.com/#!2/c6ced3/9) – AdamMc331 2014-11-06 18:32:53

0

該解決方案按字母順序排的每個員工的國籍,然後將結果付諸相應的列。

SELECT 
    emplid, 
    MAX(CASE WHEN R = 1 THEN Citizenship ELSE NULL END) AS Citizeship_1, 
    MAX(CASE WHEN R = 2 THEN Citizenship ELSE NULL END) AS Citizeship_2, 
    MAX(CASE WHEN R = 3 THEN Citizenship ELSE NULL END) AS Citizeship_3 
FROM  
    (SELECT emplid,Citizenship,RANK() OVER(PARTITION BY emplid ORDER BY Citizenship) AS R FROM @T) AS DATA 
GROUP BY 
    emplid 
+0

ranking()代碼設置按外部查詢分組查找每個員工的唯一答案的列。如果有四個國家成爲必要,那麼一個新的最大值(case when = 4 .... – 2014-11-06 20:24:23