2012-02-20 23 views
5

Tengo una tabla MySQL con campos y datos como los siguientes;MySQL, filas múltiples para separar campos

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

Estoy tratando de crear una vista en la que las partes que tienen varias filas se combinan en una sola fila, y en campos distintos, como por

Idealmente Este;

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

O puedo vivir con esta

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

Cómo iba a construir una vista o instrucción de selección para lograr esto?

Lo más cerca que he llegado hasta ahora es;

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 

Sin embargo, esto me da una fila separada para cada uno de los campos y necesito una sola línea.

+0

eso es una tabla cruzada, y sería mejor que hicieras ese tipo de transformación en y nuestro cliente. Mysql no admite consultas cruzadas directamente. –

+0

lógica es un poco confuso. Creo que se puede hacer con group_concat –

+0

Puede querer agregar una etiqueta para (o simplemente anexar al título) group-by, para que esto sea más útil para aquellos que vienen buscando :) –

Respuesta

5

Estás a falta de un grupo :)

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 

Editar:

Después de jugar por un tiempo creo que tengo la primera solución que estás buscando. Darle una oportunidad :)

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 

Para la siguiente tabla:

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

datos es convertir en esto:

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

Y, finalmente, en esto:

+------------+-------+-------+-------+ 
| 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, vencerme –

+0

Gracias, eso hace exactamente lo que yo quería Necesitaba una solución SQL porque la aplicación (de terceros y de código cerrado) que necesita usar esta información no me permite agregar ningún código. Necesito mirar más de cerca a COALESCE. –

+0

¡Bienvenido! Simplemente me inspiré: P –

Cuestiones relacionadas