Débutante Mysql - agréger des données
Fermé
cerizee
Messages postés
2
Date d'inscription
vendredi 23 janvier 2015
Statut
Membre
Dernière intervention
23 janvier 2015
-
23 janv. 2015 à 12:59
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 - 23 janv. 2015 à 14:36
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 - 23 janv. 2015 à 14:36
A voir également:
- Débutante Mysql - agréger des données
- Mysql community server - Télécharger - Bases de données
- Excel validation des données liste - Guide
- Reinstaller windows sans perte de données - Guide
- Trier des données excel - Guide
- Effacer les données de navigation - Guide
2 réponses
flokocha
Messages postés
1510
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
281
23 janv. 2015 à 14:18
23 janv. 2015 à 14:18
Salut,
Ta première approche me parait bonne. Le piège principal est effectivement que ta colonne value contient des nombres que tu souhaites additionner, mais est de type varchar. Par conséquent, cela reviendrait pour mysql à faire la somme de "toto" et "tata", ce qui est impossible. Mais additionner ce contenu de type varchar avec 0 comme tu le fais devrait suffire à transformer ce varchar en float aux yeux de mysql. Sinon, tu aurais aussi pu le caster en type decimal via la fonction DECIMAL().
Selon moi ton problème se situe donc au niveau de ton group by. En faisait un group by ts, tu conserves un détail à la seconde, tandis que tu veux un détail à la minute. De plus, tu perds potentiellement le détail par objet si tu en a plusieurs sur le même ts.
Il faut donc grouper à la fois sur les objets, sur les dates, sur les heures, et sur les minutes.
Je te conseille donc de tester ceci :
Ta première approche me parait bonne. Le piège principal est effectivement que ta colonne value contient des nombres que tu souhaites additionner, mais est de type varchar. Par conséquent, cela reviendrait pour mysql à faire la somme de "toto" et "tata", ce qui est impossible. Mais additionner ce contenu de type varchar avec 0 comme tu le fais devrait suffire à transformer ce varchar en float aux yeux de mysql. Sinon, tu aurais aussi pu le caster en type decimal via la fonction DECIMAL().
Selon moi ton problème se situe donc au niveau de ton group by. En faisait un group by ts, tu conserves un détail à la seconde, tandis que tu veux un détail à la minute. De plus, tu perds potentiellement le détail par objet si tu en a plusieurs sur le même ts.
Il faut donc grouper à la fois sur les objets, sur les dates, sur les heures, et sur les minutes.
Je te conseille donc de tester ceci :
select object, date(ts) as Dates, hour(ts) as Hours, minute(ts) as Minutes, sum(0+value) as sum_value from base.table group by object, Dates, Hours, Minutes;
cerizee
Messages postés
2
Date d'inscription
vendredi 23 janvier 2015
Statut
Membre
Dernière intervention
23 janvier 2015
Modifié par cerizee le 23/01/2015 à 14:40
Modifié par cerizee le 23/01/2015 à 14:40
La somme de l'objet fonctionne bien, mais je n'ai plus tous mes objets, mais un seul
edit:
avec group by Hours, Minutes, object; cela semble fonctionner.
Merci beaucoup pour l'aide
edit:
avec group by Hours, Minutes, object; cela semble fonctionner.
Merci beaucoup pour l'aide
flokocha
Messages postés
1510
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
281
23 janv. 2015 à 14:36
23 janv. 2015 à 14:36
Tu as tous les objets les uns à la suite des autres, une fois que toutes les combinaisons de dates, heures, minutes d'un objet sont terminées.
En gros tu auras quelque chose comme :
objet 1 | date heure minute 1 | somme
objet 1 | date heure minute 2 | somme
...
objet 1 | date heure minute N | somme
objet 2 | date heure minute 1 | somme
objet 2 | date heure minute 2 | somme
...
Si tu veux plutôt les lister en priorité par ordre de date et non par ordre d'objet, c'est à dire sous cette forme :
objet 1 | date heure minute 1 | somme
objet 2 | date heure minute 1 | somme
objet 1 | date heure minute 2 | somme
objet 2 | date heure minute 2 | somme
...
objet 1 | date heure minute N | somme
objet 2 | date heure minute N | somme
...
Il faut alors que tu changes l'ordre dans lequel tu effectues le group by, en passant object en dernier (et non en premier).
En gros tu auras quelque chose comme :
objet 1 | date heure minute 1 | somme
objet 1 | date heure minute 2 | somme
...
objet 1 | date heure minute N | somme
objet 2 | date heure minute 1 | somme
objet 2 | date heure minute 2 | somme
...
Si tu veux plutôt les lister en priorité par ordre de date et non par ordre d'objet, c'est à dire sous cette forme :
objet 1 | date heure minute 1 | somme
objet 2 | date heure minute 1 | somme
objet 1 | date heure minute 2 | somme
objet 2 | date heure minute 2 | somme
...
objet 1 | date heure minute N | somme
objet 2 | date heure minute N | somme
...
Il faut alors que tu changes l'ordre dans lequel tu effectues le group by, en passant object en dernier (et non en premier).