2010-05-10 6 views
1

OK Assistants MySQL:Réorganiser table MySQL à plusieurs lignes par horodatage

J'ai une table de données de position à partir de plusieurs sondes définies comme suit:

 
+----------+----------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+----------+----------+------+-----+---------+-------+ 
| time  | datetime | NO |  | NULL |  | 
| probe_id | char(3) | NO |  | NULL |  | 
| position | float | NO |  | NULL |  | 
+----------+----------+------+-----+---------+-------+ 

Une simple sorties sélectionnez quelque chose comme ceci:

 
+---------------------+----------+----------+ 
| time    | probe_id | position | 
+---------------------+----------+----------+ 
| 2010-05-05 14:16:42 | 00A  | 0.0045 | 
| 2010-05-05 14:16:42 | 00B  | 0.0005 | 
| 2010-05-05 14:16:42 | 00C  | 0.002 | 
| 2010-05-05 14:16:42 | 01A  |  0 | 
| 2010-05-05 14:16:42 | 01B  | 0.001 | 
| 2010-05-05 14:16:42 | 01C  | 0.0025 | 
| 2010-05-05 14:16:43 | 00A  | 0.0045 | 
| 2010-05-05 14:16:43 | 00B  | 0.0005 | 
| 2010-05-05 14:16:43 | 00C  | 0.002 | 
| 2010-05-05 14:16:43 | 01A  |  0 | 
|   .   | .  |  . | 
|   .   | .  |  . | 
|   .   | .  |  . | 
+---------------------+----------+----------+ 

Cependant, je voudrais quelque chose comme sortie suivante:

 
+---------------------+--------+--------+-------+-----+-------+--------+ 
| time    | 00A | 00B | 00C | 01A | 01B | 01C | 
+---------------------+--------+--------+-------+-----+-------+--------+ 
| 2010-05-05 14:16:42 | 0.0045 | 0.0005 | 0.002 | 0 | 0.001 | 0.0025 | 
| 2010-05-05 14:16:43 | 0.0045 | 0.0005 | 0.002 | 0 | 0.001 | 0.0025 | 
| 2010-05-05 14:16:44 | 0.0045 | 0.0005 | 0.002 | 0 | 0.001 | 0.0025 | 
| 2010-05-05 14:16:45 | 0.0045 | 0.0005 | 0.002 | 0 | 0.001 | 0.0025 | 
| 2010-05-05 14:16:46 | 0.0045 | 0.0005 | 0.002 | 0 | 0.001 | 0.0025 | 
| 2010-05-05 14:16:47 | 0.0045 | 0.0005 | 0.002 | 0 | 0.001 | 0.0025 | 
|   .   | . | . | . | . | . | . | 
|   .   | . | . | . | . | . | . | 
|   .   | . | . | . | . | . | . | 
+---------------------+--------+--------+-------+-----+-------+--------+ 

Idéalement, les différentes colonnes de position de la sonde sont générées dynamiquement en fonction des données de la table. Est-ce possible, ou suis-je en train de me tirer les cheveux pour rien?

J'ai essayé GROUP BY avec GROUP_CONCAT qui permet d'extraire grossièrement les données, mais je ne peux pas séparer cette sortie dans les colonnes probe_id.

 
mysql> SELECT time, GROUP_CONCAT(probe_id), GROUP_CONCAT(position) FROM MG41 GROUP BY time LIMIT 10; 
+---------------------+-------------------------+------------------------------------+ 
| time    | GROUP_CONCAT(probe_id) | GROUP_CONCAT(position)    | 
+---------------------+-------------------------+------------------------------------+ 
| 2010-05-05 14:16:42 | 00A,00B,00C,01A,01B,01C | 0.0045,0.0005,0.002,0,0.001,0.0025 | 
| 2010-05-05 14:16:43 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:44 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:45 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:46 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:47 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:48 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:49 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:50 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:51 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
+---------------------+-------------------------+------------------------------------+ 

Répondre

2
SELECT 
    time, 
    SUM(CASE WHEN probe_id = '00A' THEN position ELSE 0 END) `00A`, 
    SUM(CASE WHEN probe_id = '00B' THEN position ELSE 0 END) `00B`, 
    SUM(CASE WHEN probe_id = '00C' THEN position ELSE 0 END) `00C`, 
    SUM(CASE WHEN probe_id = '01A' THEN position ELSE 0 END) `01A`, 
    SUM(CASE WHEN probe_id = '01B' THEN position ELSE 0 END) `01B`, 
    SUM(CASE WHEN probe_id = '01C' THEN position ELSE 0 END) `01C` 
FROM MG41 
GROUP BY time LIMIT 10; 
+0

Merci Mark. J'ai ajouté ROUND (x, 4) pour supprimer les décimales supplémentaires de SUM. –

1

avoir un nombre dynamique de lignes, vous aurez besoin d'une requête générée dynamiquement. (Si vous savez à l'avance les probe_ids, vous pouvez Juse utiliser une requête statique.)

La forme générale sera

SELECT time, P00A, P00B, ... P03B, etc.. 
    FROM 
     (SELECT time FROM MG41 GROUP BY time) allTimes 
    INNER JOIN 
     (SELECT time, position AS P00A from MG41 WHERE probe_id='00A') pt00A 
     ON pt00A.time=allTimes.time 
    INNER JOIN 
     (SELECT time, position AS P00B from MG41 WHERE probe_id='00B') pt00B 
     ON pt00B.time=allTimes.time 

etc... 

Vous construisez ensuite le INNER JOIN et les lignes sélectionnées pour toutes les différentes sondes.

Questions connexes