2017-08-20 1 views
1

Je voudrais afficher les résultats dans une rangée et les séparer par colonne pour des valeurs spécifiques.MySQL Select - Fusionner les lignes lorsque le numéro

mysql> +----------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+------+---------------------+ 
    -> | temp_series_id | CO | DP | BO | DZ | KT | KR | DR | GZ | GP | PD | CD | date    | 
    -> +----------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+------+---------------------+ 
    -> |   272138 | 21.12 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | 20.06 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | 18.69 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | 21.81 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | NULL | 22.06 | NULL | NULL | NULL | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | NULL | NULL | 22.44 | NULL | NULL | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | NULL | NULL | NULL | 14.69 | NULL | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 24.69 | NULL | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 22.75 | NULL | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 19.94 | NULL | 2017-08-20 14:06:46 | 
    -> |   272138 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 24.5 | 2017-08-20 14:06:46 | 
    -> +----------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+------+---------------------+ 

Comment puis-je fusionner ces lignes à un? Quelque chose comme group by temp_series_id et supprimer les valeurs nulles

SELECT 
    SQL_NO_CACHE 
    temp_series_id, 
    CASE WHEN temp_details_id = 1 THEN value END AS 'CO', 
    ... 
    CASE WHEN temp_details_id = 11 THEN value END AS 'CD', 
    date 
FROM (SELECT * 
     FROM temp_series 
     ORDER BY date DESC 
     LIMIT 1) 
    series INNER JOIN temp_object objects ON series.id = objects.temp_series_id 
    INNER JOIN temp_details details ON details.id = objects.temp_details_id; 

Ci-dessous vous pouvez voir le résultat que je voudrais faire

+----------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+------+---------------------+ 
| temp_series_id | CO | DP | BO | DZ | KT | KR | DR | GZ | GP | PD | CD | date    | 
+----------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+------+---------------------+ 
|   272138 | 21.12 | 20.06 | 18.69 | 21.81 | 22.06 | 22.44 | 14.69 | 24.69 | 22.75 | 19.94 | 24.5 | 2017-08-20 14:06:46 | 
+----------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+------+---------------------+ 
+0

vous conseillons de lire à propos de « tableau croisé dynamique » –

Répondre

1

Utiliser l'agrégation:

SELECT SQL_NO_CACHE 
     temp_series_id, 
     MAX(CASE WHEN temp_details_id = 1 THEN value END) AS CO, 
     ... 
     MAX(CASE WHEN temp_details_id = 11 THEN value END) AS CD, 
     date 
FROM (SELECT * 
     FROM temp_series 
     ORDER BY date DESC 
     LIMIT 1 
    ) series INNER JOIN 
    temp_object objects 
    ON series.id = objects.temp_series_id INNER JOIN 
    temp_details details 
    ON details.id = objects.temp_details_id 
GROUP BY temp_series_id, date; 
+1

MAX() fonctionne magiquement, merci –