Query Mysql per convertire dynamicmente le righe in colonne

MySQL può convertire colonne in righe, aggiungendo dynamicmente tutte le colonne necessarie per le righe. Penso che la mia domanda potrebbe essere correlata a tabelle pivot ma non sono sicuro e non so come inquadrare questa domanda se non dando il seguente esempio.

Dato un due tavoli A e B, che assomigliano

Tabella A

+--+-----+----+ |id|order|data| +--+-----+----+ |1 |1 |P | +--+-----+----+ |2 |2 |Q | +--+-----+----+ |2 |1 |R | +--+-----+----+ |1 |2 |S | +--+-----+----+ 

Mi piace scrivere una query simile alla seguente:

Tabella dei risultati

 +--+-----+-----+ |id|data1|data2| +--+-----+-----+ |1 |P |S | +--+-----+-----+ |2 |R |Q | +--+-----+-----+ 

Fondamentalmente voglio trasformare ogni riga nella tabella B in una colonna nella tabella dei risultati. Se è stata aggiunta una nuova voce alla tabella B per id = 1, desidero che la tabella dei risultati si estenda automaticamente di una colonna per contenere questo punto dati aggiuntivo.

È ansible utilizzare GROUP BY e MAX per simulare il pivot. MySQL supporta anche la dichiarazione IF .

 SELECT ID, MAX(IF(`order` = 1, data, NULL)) data1, MAX(IF(`order` = 2, data, NULL)) data2 FROM TableA GROUP BY ID 
  • Demo di SQLFiddle

Se si dispone di più valori di order , SQL dinamico potrebbe essere più appropriato in modo che non sia necessario modificare la query:

 SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`) ) INTO @sql FROM TableName; SET @sql = CONCAT('SELECT ID, ', @sql, ' FROM TableName GROUP BY ID'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 
  • Demo di SQLFiddle
  • SQLFiddle Demo ( altro esempio )

PRODUZIONE DI ENTRAMBI I QUEST!

 ╔════╦═══════╦═══════╗ ║ ID ║ DATA1 ║ DATA2 ║ ╠════╬═══════╬═══════╣ ║ 1 ║ P ║ S ║ ║ 2 ║ R ║ Q ║ ╚════╩═══════╩═══════╝ 

È necessario utilizzare MAX e GROUP BY per simulare un PIVOT:

 SELECT Id, MAX(CASE WHEN Order = 1 THEN data END) data1, MAX(CASE WHEN Order = 2 THEN data END) data2 FROM TableA GROUP BY Id 

Ed ecco l’ SQL Fiddle .