2016-09-28 1 views
3

Donc, je dois utiliser une base de données qui a l'heure en colonne (il y a une colonne toutes les 10 min dans un jour spécifique), le id ici n'est pas une clé primaire, même si elle est unique (et une clé primaire) dans une autre table. Et les rangées sont égales à un jour. Donc, je voudrais avoir la valeur pour chaque tranche de temps avec son datetime sur une ligne.Colonne comme une ligne concaténée avec une autre colonne

Est-ce encore possible? Je pourrais écrire un petit programme qui recréerait une table avec ce dont j'ai besoin mais j'aimerais avoir autant de données en double que possible.

Ce que j'ai:

+---+----------+-----+-----+-----+-----+ 
|ID | DATE |00h00|00h10|00h20|00h30| 
+---+----------+-----+-----+-----+-----+ 
|1 |2016-09-28|80 |79 |75 |73 | 
+---+----------+-----+-----+-----+-----+ 
|1 |2016-09-27|82 |80 |76 |74 | 
+---+----------+-----+-----+-----+-----+ 

Ce que je voudrais avoir:

+---+----------------+-----+ 
|ID |  DATE |VALUE| 
+---+----------------+-----+ 
|1 |2016-09-28 00h00|80 | 
|1 |2016-09-28 00h10|79 | 
|1 |2016-09-28 00h20|75 | 
|1 |2016-09-28 00h30|73 | 
+---+----------------+-----+ 
|1 |2016-09-28 00h00|82 | 
|1 |2016-09-28 00h10|80 | 
|1 |2016-09-28 00h20|76 | 
|1 |2016-09-28 00h30|74 | 
+---+----------------+-----+ 

Répondre

4

La façon la plus simple est d'utiliser union all:

select id, date_add(date, interval 0 minute) as date, `00h00` as value from t union all 
select id, date_add(date, interval 10 minute) as date, `00h10` as value from t union all 
. . . 

Si vous avez un nombre tableau, vous pouvez également faire:

select t.id, date_add(date, interval (n.n - 1) * 10 minute) as date, 
     (case when n = 1 then `00h00` 
      when n = 2 then `00h10` 
      . . . 
     end) as value 
from t join 
    numbers n 
    on n.n < 24 * 6; 

Je ne pense pas qu'il y ait un moyen de faire cela dans MySQL sans énumérer toutes les colonnes d'une manière ou d'une autre. Vous pouvez utiliser une autre requête ou une feuille de calcul pour générer le code SQL.

+0

Vous êtes un génie! Ca marche, c'est un peu moche car ce sont des colonnes 24 * 6 mais waouh merci! –

+0

Il y a juste une petite faute de frappe, vous répondez que c'est 'date_add()' pas 'dateadd()', btw les numéros de table signifient '00h00',' 00h10' ...? –