resultados de búsqueda pivote mysql con GROUP BY

Tengo una tabla de datos que quiero exportar a un archivo CSV. Idealmente, me gustaría cambiar las filas y las columnas para que los datos se agrupen un poco mejor.

Para explicar más, actualmente, la base de datos se ve así ..

data_id data_timestamp data_value -------------------------------------------- 1 2011-07-07 00:01:00 0.400 1 2011-07-07 00:02:00 0.500 1 2011-07-07 00:03:00 0.600 1 2011-07-07 00:04:00 0.700 2 2011-07-07 00:01:00 0.100 2 2011-07-07 00:02:00 0.200 2 2011-07-07 00:03:00 0.250 2 2011-07-07 00:04:00 2.300 

Lo que me gustaría hacer es agrupar el data_value con el valor data_timestamp, de modo que las marcas de tiempo estén agrupadas, y cada data_value para cada data_id se muestre en una columna, en lugar de una fila.

 data_timestamp input_1 input_2 -------------------------------------------- 2011-07-07 00:01:00 0.400 0.100 2011-07-07 00:02:00 0.500 0.200 2011-07-07 00:03:00 0.600 0.250 2011-07-07 00:04:00 0.700 2.300 

Debajo está la consulta que estoy usando …

 SELECT d.data_timestamp, d.input_1, d.input_2 FROM ( SELECT data_timestamp, IF(data_id=1,data_value,NULL) AS 'input_1', IF(data_id=2,data_value,NULL) AS 'input_2' FROM data ) AS d ORDER BY data_timestamp ASC 

Pero no es exactamente lo que quiero, ya que ahora hay valores NULL cuando un data_id no tiene un valor. GROUP BY parece agrupar también el data_value, que no es lo que quiero.

¿Alguna sugerencia?

EDITAR:

Ya he intentado utilizar WHERE d.input_1 IS NOT NULL en la consulta externa, pero no puedo obtener los resultados.

Antes de WHERE …

 data_timestamp input_1 input_2 -------------------------------------------- 2011-07-07 00:01:00 0.400 NULL 2011-07-07 00:01:00 NULL 0.100 2011-07-07 00:02:00 0.500 NULL 2011-07-07 00:02:00 NULL 0.200 2011-07-07 00:03:00 0.600 NULL 2011-07-07 00:03:00 NULL 0.250 2011-07-07 00:04:00 0.700 NULL 2011-07-07 00:04:00 NULL 2.300 

Al agregar WHERE d.input_1 IS NOT NULL, se eliminarán los valores de input_2.

 data_timestamp input_1 input_2 -------------------------------------------- 2011-07-07 00:01:00 0.400 NULL 2011-07-07 00:02:00 0.500 NULL 2011-07-07 00:03:00 0.600 NULL 2011-07-07 00:04:00 0.700 NULL 

Además, en realidad, tengo alrededor de 20 identificadores para agruparlos, por lo que tampoco sería la mejor idea para O para todos.

PIVOT no es fácil (ni agradable) de hacer. Prefiero usar CASE :

 SELECT d.data_timestamp , SUM( CASE WHEN data_id = 1 THEN data_value ELSE 0 END ) AS 'input_1' , SUM( CASE WHEN data_id = 2 THEN data_value ELSE 0 END ) AS 'input_2' ... , SUM( CASE WHEN data_id = 20 THEN data_value ELSE 0 END ) AS 'input_20' FROM data GROUP BY data_timestamp ORDER BY data_timestamp ASC 

pero IF funciona en MySQL:

 SELECT d.data_timestamp , SUM( IF(data_id = 1, data_value, 0) ) AS 'input_1' , SUM( IF(data_id = 2, data_value, 0) ) AS 'input_2' ... , SUM( IF(data_id = 20, data_value, 0) ) AS 'input_20' FROM data GROUP BY data_timestamp ORDER BY data_timestamp ASC 

Alternativamente, puede usar un JOIN 20 niveles:

 SELECT d.data_timestamp , d01.data_value AS 'input_1' , d02.data_value AS 'input_2' ... , d20.data_value AS 'input_20' FROM ( SELECT DISTINCT d.data_timestamp FROM data ) AS d LEFT JOIN data AS d01 ON d01.data_timestamp = d.data_timestamp AND d01.data_id = 1 LEFT JOIN data AS d02 ON d02.data_timestamp = d.data_timestamp AND d02.data_id = 2 ... --- 20 JOINs LEFT JOIN data AS d20 ON d20.data_timestamp = d.data_timestamp AND d20.data_id = 20 ORDER BY d.data_timestamp ASC 

¡Únete a la mesa solo!

 SELECT dt1.data_timestamp, dt1.input_1, dt2.input_2 FROM data_timestamp dt1 JOIN data_timestamp dt2 on dt1.data_timestamp = dt2.data_timestamp and dt2.input_1 is null WHERE dt1.input_2 is null; 

Tenga en cuenta que esta consulta asume que el valor de input_2 está presente para cada valor de entrada_1. Si ese no es el caso, use LEFT JOIN o CROSS JOIN etc.