2012-02-20 70 views
5

我有一個MySQL表,其中包含如下的字段和數據;MySQL,多行分隔字段

PartNumber Priority SupName 
a1   0  One 
a2   0  One 
a2   1  Two 
a3   0  One 
a4   1  Two 
a5   2  Three 

我試圖創建其中具有多行的部分被組合成一個單一的行的視圖,並且爲單獨的字段,諸如

理想地這;

PartNumber Sup1 Sup2 Sup3 
a1   One NULL NULL 
a2   One Two NULL 
a3   One NULL NULL 
a4   Two NULL NULL 
a5   Three NULL NULL 

或者,我可以用這個

PartNumber Sup1 Sup2 Sup3 
a1   One NULL NULL 
a2   One Two NULL 
a3   One NULL NULL 
a4   NULL Two NULL 
a5   NULL NULL Three 

活着,我將如何建立一個視圖或SELECT語句來做到這一點?

我到目前爲止最接近的是;

SELECT PartNumber, 
     IF(Priority=0, SupName, NULL) AS Sup1, 
     IF(Priority=1, SupName, NULL) AS Sup2, 
     IF(Priority=2, SupName, NULL) AS Sup3 
    FROM SupXref 
ORDER BY PartNumber 

然而,這給了我一個單獨的行,每個領域,我需要一個單一的行。

+0

這一個交叉表,你最好在y上進行這種轉換我們的客戶。 Mysql不直接支持交叉表查詢。 – 2012-02-20 05:04:32

+0

邏輯有點混亂。我認爲你可以做group_concat – 2012-02-20 05:07:57

+0

可能想添加一個標籤(或只是附加到標題)group-by,使這對那些誰來搜索更有幫助:) – 2012-02-20 05:10:05

回答

5

你只是缺少一組由:)

SELECT PartNumber, 
    MAX(IF (Priority = 0, SupName, NULL)) AS Sup1, 
    MAX(IF (Priority = 1, SupName, NULL)) AS Sup2, 
    MAX(IF (Priority = 2, SupName, NULL)) AS Sup3 
FROM SupXref 
GROUP BY PartNumber 

編輯:

玩了一會兒後,我覺得我有你要找的第一個解決方案。試試看吧:)

SELECT partnumber, 
    COALESCE(Sup1, COALESCE(Sup2, Sup3)) AS Supp1, 
    IF (Sup1 IS NULL, IF (Sup2 IS NULL, NULL, Sup3), COALESCE(Sup2, Sup3)) AS Supp2, 
    IF (Sup1 IS NULL, NULL, IF (Sup2 IS NULL, NULL, Sup3)) AS Supp3 
FROM (
    SELECT PartNumber, 
    MAX(IF (Priority = 0, SupName, NULL)) AS Sup1, 
    MAX(IF (Priority = 1, SupName, NULL)) AS Sup2, 
    MAX(IF (Priority = 2, SupName, NULL)) AS Sup3 
    FROM SupXref 
    GROUP BY PartNumber 
) AS S 

爲下表:

+------------+----------+---------+ 
| PARTNUMBER | PRIORITY | SUPNAME | 
+------------+----------+---------+ 
| a1   |  2 | Three | 
| a2   |  1 | Two  | 
| a3   |  2 | Three | 
| a3   |  1 | Two  | 
| a4   |  0 | One  | 
| a5   |  0 | One  | 
| a5   |  2 | Three | 
| a6   |  0 | One  | 
| a6   |  1 | Two  | 
| a7   |  0 | One  | 
| a7   |  1 | Two  | 
| a7   |  2 | Three | 
+------------+----------+---------+ 

數據是變成這樣:

+------------+------+------+-------+ 
| PARTNUMBER | SUP1 | SUP2 | SUP3 | 
+------------+------+------+-------+ 
| a1   |  |  | Three | 
| a2   |  | Two |  | 
| a3   |  | Two | Three | 
| a4   | One |  |  | 
| a5   | One |  | Three | 
| a6   | One | Two |  | 
| a7   | One | Two | Three | 
+------------+------+------+-------+ 

,最後變成這樣:

+------------+-------+-------+-------+ 
| PARTNUMBER | SUPP1 | SUPP2 | SUPP3 | 
+------------+-------+-------+-------+ 
| a1   | Three |  |  | 
| a2   | Two |  |  | 
| a3   | Two | Three |  | 
| a4   | One |  |  | 
| a5   | One | Three |  | 
| a6   | One | Two |  | 
| a7   | One | Two | Three | 
+------------+-------+-------+-------+ 
+1

+1:詛咒,打我 – 2012-02-20 05:04:08

+0

謝謝,這正是我想要的。我需要一個SQL解決方案,因爲需要使用這些信息的應用程序(第三方和封閉源代碼)不允許我添加任何代碼。我需要仔細看看COALESCE。 – 2012-02-20 12:25:25

+0

歡迎!剛剛得到啓發:P – 2012-02-20 12:27:30