2012-02-20 16 views
5

Ho una tabella MySQL con campi e dati come segue;MySQL, più righe per separare i campi

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

Sto cercando di creare una vista in cui le parti che hanno più righe sono combinati in una singola riga, e in campi separati come

Idealmente questo;

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 posso vivere con questo

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

Come vorrei costruire una vista o select per raggiungere questo obiettivo?

Il più vicino che ho fatto finora è;

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 

Questo tuttavia mi dà una riga separata per ciascuno dei campi e ho bisogno di una singola riga.

+0

che è una tabella incrociata e starai meglio a fare quel tipo di trasformazione in y il nostro cliente. Mysql non supporta direttamente le query a campi incrociati. La logica –

+0

è un po 'confusa. Penso che si possa fare con group_concat –

+0

Potrebbe voler aggiungere un tag per (o semplicemente aggiungere al titolo) group-by, per renderlo più utile a chi viene a cercare :) –

risposta

5

Sei solo manca un gruppo da :)

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:

Dopo aver giocato per un po 'Penso che ho avuto la prima soluzione che stai cercando. Fare un tentativo :)

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 

Per la tabella seguente:

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

dati è trasformare in questo:

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

e infine in questo:

+------------+-------+-------+-------+ 
| 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: Maledizioni, battimi –

+0

Grazie, questo fa esattamente quello che volevo. Avevo bisogno di una soluzione SQL perché l'applicazione (di terze parti e closed source) che ha bisogno di utilizzare queste informazioni non mi permette di aggiungere alcun codice. Devo guardare più da vicino a COALESCE. –

+0

Benvenuto! Mi sono appena ispirato: P –

Problemi correlati