2014-11-04 101 views
1

我有以下的數據集(樣本):MySQL的 - 重塑數據

emplid | Citizeship | 
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   |    | 

的假設是,各個emplid會有多達4個國籍。

我開始用下面的代碼,但對於emplid小號誰只是有1 citizenship,正在重演在citizenship_2citizenship_3價值,這應該只是空白:

select * 
, substring_index(Citizenship_multiple, ',', 1) as Citizenship_1 
, substring_index(substring_index(Citizenship_multiple,',',-1),',',1) as Citizenship_2 
, substring_index(substring_index(Citizenship_multiple,',',-2),',',1) as Citizenship_3 
, substring_index(substring_index(Citizenship_multiple,',',-3),',',1) as Citizenship_4 
from 
    (select * 
     , group_concat(distinct Citizenship) as Citizenship_multiple 
     from `citizenship_csv_meta` 
     group by emplid) a 

回答

1

你可以做到這一點結合案例和最大

SELECT emplid, 
     max(case when Citizeship = 'USA' then 'USA' else '' end) as Citizeship_1, 
     max(case when Citizeship = 'CHN' then 'CHN' else '' end) as Citizeship_2, 
     max(case when Citizeship = 'CAN' then 'CAN' else '' end) as Citizeship_3 
FROM citizenship_csv_meta 
GROUP BY emplid 
+0

感謝,但我給的數據只是一個小樣本,真正的數據集將有超過170個國家,所以我不認爲硬編碼國家是有效的:( – PMa 2014-11-04 23:16:45

1

我知道你說硬編碼是一個痛苦,而且可能不是最好的解決辦法,但我能做到這一點,而只使用一個假設:員工最多可以有4國籍。所以,我剛剛4次加入你的餐桌。我不得不使用外部連接,因爲不是每個員工都有4個國籍。下面是代碼,我將解釋我做了什麼:

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 

我一起加入你的表4倍,並採取了MAX()公民從每個組。這是有效的原因是因爲在連接條件我使用e1.citizenship < e.citizenship來確保以前的值不包括在內。例如,表e2從不包含USA,所以我可以再次使用max函數。

這樣做的結果是,一旦員工不再具有公民身份,其餘列中的單元格就會爲空,因此您需要注意這一點。

這在SQL Fiddle上測試的很好,我實際上引用了這個question來弄清楚如何獲得成功的公民。當然,我使用的方法與這些方法略有不同,但我希望在信用到期時給予獎勵。

編輯

如果你想用一個空值替換空細胞,參照本SQL Fiddle.

+0

我會讓你知道它是否工作,但截至目前,查詢仍在運行,它已運行超過10分鐘,我不知道是否是因爲我的數據集很大,並且自加入通常會降低性能? – PMa 2014-11-05 05:22:42

+0

這是可能的。我只用SQL fiddl上的少數幾行進行了測試e,我當然沒有效率專家,但是你的數據集運行10分鐘的時間有多大? – AdamMc331 2014-11-05 05:26:04

+0

@PririMa我認爲你沒有運氣? – AdamMc331 2014-11-05 12:18:59