2012-02-20 40 views
5

Tôi có bảng MySQL với các trường và dữ liệu như sau;MySQL, nhiều hàng để tách các trường

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

tôi đang cố gắng để tạo ra một cái nhìn nơi bộ phận mà có nhiều hàng được kết hợp thành một hàng duy nhất, và vào các lĩnh vực riêng biệt như

Lý tưởng này;

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

Hoặc tôi có thể sống với điều này

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

Làm thế nào tôi sẽ xây dựng một cái nhìn hoặc lựa chọn công bố để thực hiện điều này?

Điều gần nhất mà tôi đã thực hiện cho đến thời điểm này là;

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 

Tuy nhiên, điều này cho tôi một hàng riêng biệt cho từng trường và tôi cần một dòng.

+0

đó là một crosstab, và bạn sẽ tốt hơn khi thực hiện loại chuyển đổi đó trong y khách hàng của chúng tôi. Mysql không hỗ trợ truy vấn chéo bảng trực tiếp. –

+0

logic có chút khó hiểu. Tôi nghĩ rằng bạn có thể làm với group_concat –

+0

Có thể muốn thêm một thẻ cho (hoặc chỉ thêm vào tiêu đề) theo nhóm, để làm điều này hữu ích hơn cho những người đến tìm kiếm :) –

Trả lời

5

Bạn chỉ cần thiếu một nhóm bởi :)

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 

Edit:

Sau khi chơi cho một trong khi tôi nghĩ rằng tôi có giải pháp đầu tiên bạn đang tìm kiếm. Hãy thử :)

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 

Đối với bảng sau:

+------------+----------+---------+ 
| 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 | 
+------------+----------+---------+ 

dữ liệu là biến thành này:

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

Và cuối cùng vào đây:

+------------+-------+-------+-------+ 
| 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: Curses, đánh bại tôi –

+0

Cảm ơn, điều đó thực hiện chính xác những gì tôi muốn. Tôi cần một giải pháp SQL vì ứng dụng (bên thứ ba và nguồn đóng) cần sử dụng thông tin này không cho phép tôi thêm bất kỳ mã nào. Tôi cần phải xem xét kỹ hơn COALESCE. –

+0

Chào mừng bạn! Chỉ có cảm hứng: P –

Các vấn đề liên quan