IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Somme chaque jour du mois


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Somme chaque jour du mois
    Bonjour,

    Le titre n'est pas explicite mais je souhaiterai faire la somme d'une donnée pour chaque jour du mois même lorsqu'il n'y a pas de donnée pour tous les jours.

    J'ai une table qui stocke la pluviomètrie des jours de pluie.

    Voici la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > describe rainfall ;
    Field   Type    Null    Key     Default Extra
    timestamp       bigint(10)      NO      PRI     0
    rec_date        date    NO              0000-00-00
    rec_time        time    NO              00:00:00
    source  varchar(128)    NO              NULL
    device  varchar(128)    NO              NULL
    type    varchar(128)    NO              NULL
    current decimal(6,4)    NO              0.0000
    Voici son contenu pour une journée donnée par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    > SELECT * FROM rainfall where rec_date=20120101 ORDER BY timestamp DESC
    timestamp       rec_date        rec_time        source  device  		type    	current
    1325457788      2012-01-01      23:43:08        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325456137      2012-01-01      23:15:37        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325455105      2012-01-01      22:58:25        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325454004      2012-01-01      22:40:04        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325453454      2012-01-01      22:30:54        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325453317      2012-01-01      22:28:37        sender  1D.61BF0D000000.B       rainfall        0.5588
    1325453248      2012-01-01      22:27:28        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325453179      2012-01-01      22:26:19        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325453110      2012-01-01      22:25:10        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325452904      2012-01-01      22:21:44        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325451391      2012-01-01      21:56:31        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325450703      2012-01-01      21:45:03        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325443688      2012-01-01      19:48:08        sender  1D.61BF0D000000.B       rainfall        0.2794
    1325399588      2012-01-01      07:33:08        sender  1D.61BF0D000000.B       rainfall        0.2794
    J'arrive à afficher le cumul de pluie par jour par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    > SELECT rec_date, SUM(current) as pluvio FROM rainfall GROUP BY rec_date ORDER BY timestamp DESC LIMIT 20 ;
    rec_date        pluvio
    2012-02-13      0.5588
    2012-02-10      0.2794
    2012-02-09      0.2794
    2012-02-06      0.5588
    2012-01-28      1.6764
    2012-01-27      0.8382
    2012-01-26      1.1176
    2012-01-25      1.6764
    2012-01-24      9.2202
    2012-01-23      2.2352
    2012-01-21      1.1176
    2012-01-20      0.8382
    2012-01-19      2.2352
    2012-01-18      0.8382
    2012-01-17      0.2794
    2012-01-14      0.2794
    2012-01-07      0.5588
    2012-01-05      2.7940
    2012-01-03      2.5146
    2012-01-02      12.2936
    J'affiche le résultat sous forme graphique.
    La table ne stockant les données que pour les jours de pluie, ce que je voudrais c'est afficher aussi les jours sans pluie. La valeur serait à zéro mais le graphe serait plus parlant.

    Est ce possible avec une requète SQL (mysql) ?

    J'aimerai faire de même pour chaque heure d'une journée.

    merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il faut utiliser une table calendrier

  3. #3
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    L'idée est de te faire une procédure stockée qui va:
    • crée une table temporaire pour le mois et pour le jour (ou une plage horaire)...
    • la peupler avec une boucle qui passe en revue la période voulue au pas que tu veux (jour ou heure) et récupère les données correspondante si elles existent
    • l'afficher


    pourquoi une table temporaire? car si tu fais une table permanente faut la maintenir à jour par rapport aux tables qui servent à la peupler... donc risque de loupé...

    là tu génères ce que tu as besoin à la volé, avec 2 procédures stockées (mois et jour) ça reste côté mysql donc très performant et ça te fait qu'à récupérer et faire tes graphiques coté langage serveur
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci pour vos retour,

    Je suis assez basique dans la pratique de MySql.

    Possible d'avoir un exemple pour créer/utiliser ce type de procédure ?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Avoir une dimension temps est très classique, et avec une table en dur toutes les requêtes peuvent facilement en profiter.
    Citation Envoyé par ericd69 Voir le message
    pourquoi une table temporaire? car si tu fais une table permanente faut la maintenir à jour par rapport aux tables qui servent à la peupler... donc risque de loupé...
    Je ne vois pas ce que tu veux dire, tu crées la table avec toutes les données nécessaires sur 10, 50 ou 100 ans et donc la prochaine maintenance se fait dans 10, 50 ou 100 ans, si jamais elle a lieu.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Moi je vote pour skuatamad, car créer une vrai usine pour un besoin si simple c'est contre productif.

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    un truc du genre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    delimiter $$
    drop procedure if exists somme$$
    create procedure somme(in a int,in m int,in d int)
    begin
    	declare jour date;
    	declare i tinyint;
    	drop table if exists tmp_data;
    	if isnull(d) then
    	begin
    		declare j tinyint;
    		create temporary table tmp_data(
    			id	smallint not null auto_increment,
    			t	date not null,
    			s	decimal(6,4) not null,
    			primary key(id)
    		);
    		set jour=concat(a,'-',m,'-01'),i=1,j=day(last_day(jour))+1;
    		while i<j do
    			insert into tmp_data(t,s)
    				select jour,sum(current)
    				from rain_fall
    				where rec_date=jour;
    			set i=i+1,jour=concat(a,'-',m,'-',i);
    		end while;
    	end;
    	else
    	begin
    		declare heure time default 0;
    		create temporary table tmp_data(
    			id	smallint not null auto_increment,
    			t	time not null,
    			s	decimal(6,4) not null,
    			primary key(id)
    		);
    		set jour=concat(a,'-',m,'-',d),i=0;
    		while i<24 do
    			insert into tmp_data(t,s)
    				select heure,sum(current)
    				from rain_fall
    				where rec_date=jour 
    				and rec_time between heure and maketime(i,59,59);
    			set i=i+1,heure=maketime(i,0,0);
    		end while;
    	end;
    	end if;
    	select t as `date`,s as `valeur` from tmp_data;
    end$$
    delimiter ;
     
    -- exemples d'appel
     
    -- liste des valeurs sur le mois 1 de l'année 2012
    call somme(2012,1,null);
     
    -- liste des valeurs sur le jour 1 du  mois 1 de l'année 2012
    call somme(2012,1,1);

    voilà c'est vrai quelle usine à gaz...

    ça te fait directement ta liste de valeur que tu veux

    pourquoi ça peut être mieux? quelques idées:
    • pas besoin de cron (pour une automatisation pas toujours possible) ou de mises à jour manuelles de tes 2 tables de résultats... et ensuite d'extraire l'intervalle de valeur souhaité...
    • tu ne génères qu'une table temporaire très compacte... peux d'occupation de ressources sur le serveur mysql
    • tu es sur que tes données affichées sont à jour...
    • si la colonne rec_date est indexée alors le temps de génération est vraiment minuscule...
    • tu peux modifier les traitement ou ta structure de données sans forcément avoir besoin de modifier ton code coté langage serveur pour peu que ça ne change pas la façon dont ils lui sont transmis


    si tes tables de mesures ne sont pas générées automatiquement par l'équipement (bien que vu leur tête ça y ressemble fortement)... alors tu devrais virer les divers valeurs textes dans des tables annexes et les remplacer par leur index équivalent dans celle-ci... tu compacterais de manière drastique la taille de ta table de mesures et quand sa taille va devenir non négligeable en terme de ligne, les temps d'accès

    voilà... tu es libre de la méthode
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    @ericd69

    merci la procedure fonctionne nickel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    mysql> call somme(2012,1,NULL);
    +------------+---------+
    | date       | valeur  |
    +------------+---------+
    | 2012-01-01 |  4.1910 |
    | 2012-01-02 | 12.2936 |
    | 2012-01-03 |  2.5146 |
    | 2012-01-04 |  0.0000 |
    | 2012-01-05 |  2.7940 |
    | 2012-01-06 |  0.0000 |
    | 2012-01-07 |  0.5588 |
    | 2012-01-08 |  0.0000 |
    | 2012-01-09 |  0.0000 |
    | 2012-01-10 |  0.0000 |
    | 2012-01-11 |  0.0000 |
    | 2012-01-12 |  0.0000 |
    | 2012-01-13 |  0.0000 |
    | 2012-01-14 |  0.2794 |
    | 2012-01-15 |  0.0000 |
    | 2012-01-16 |  0.0000 |
    | 2012-01-17 |  0.2794 |
    | 2012-01-18 |  0.8382 |
    | 2012-01-19 |  2.2352 |
    | 2012-01-20 |  0.8382 |
    | 2012-01-21 |  1.1176 |
    | 2012-01-22 |  0.0000 |
    | 2012-01-23 |  2.2352 |
    | 2012-01-24 |  9.2202 |
    | 2012-01-25 |  1.6764 |
    | 2012-01-26 |  1.1176 |
    | 2012-01-27 |  0.8382 |
    | 2012-01-28 |  1.6764 |
    | 2012-01-29 |  0.0000 |
    | 2012-01-30 |  0.0000 |
    | 2012-01-31 |  0.0000 |
    +------------+---------+
    31 rows in set (0.13 sec)
     
    Query OK, 0 rows affected, 15 warnings (0.13 sec)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    mysql> call somme(2012,1,2);
    +----------+--------+
    | date     | valeur |
    +----------+--------+
    | 00:00:00 | 0.8382 |
    | 01:00:00 | 1.6764 |
    | 02:00:00 | 3.9116 |
    | 03:00:00 | 2.5146 |
    | 04:00:00 | 0.5588 |
    | 05:00:00 | 0.0000 |
    | 06:00:00 | 0.0000 |
    | 07:00:00 | 0.0000 |
    | 08:00:00 | 0.0000 |
    | 09:00:00 | 0.0000 |
    | 10:00:00 | 0.0000 |
    | 11:00:00 | 0.0000 |
    | 12:00:00 | 0.0000 |
    | 13:00:00 | 0.0000 |
    | 14:00:00 | 0.0000 |
    | 15:00:00 | 1.9558 |
    | 16:00:00 | 0.5588 |
    | 17:00:00 | 0.0000 |
    | 18:00:00 | 0.0000 |
    | 19:00:00 | 0.0000 |
    | 20:00:00 | 0.2794 |
    | 21:00:00 | 0.0000 |
    | 22:00:00 | 0.0000 |
    | 23:00:00 | 0.0000 |
    +----------+--------+
    24 rows in set (0.10 sec)
     
    Query OK, 0 rows affected, 16 warnings (0.10 sec)
    merci à vous tous pour votre aide

  9. #9
    Candidat au Club
    Femme Profil pro
    ista
    Inscrit en
    Septembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ista
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2016
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Aidez
    Svp aussi je chechre la solution de ça mais sur c#

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut karimaista.

    Il serait plus profitable pour tout le monde de ne pas déterrer un vieux sujet mais de poser votre question dans un nouveau sujet.

    Si vous désirez que l'on vous réponde selon votre problématique, il nous faut :
    --> les explications de ce que vous essayez de faire.
    --> un jeu d'essai
    --> le résultat attendu.

    Sinon, je ferrais la même réponse que skuatamad, "Il faut utiliser une table calendrier".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Candidat au Club
    Femme Profil pro
    ista
    Inscrit en
    Septembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ista
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2016
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre attention! ! J'ai trouvée la solution

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] La somme entre 2 années successives avec jours et mois fixes
    Par mouhamadrouabha dans le forum Access
    Réponses: 15
    Dernier message: 07/02/2012, 09h27
  2. manipulation de date pour chaque jour du mois
    Par renardchan dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/06/2011, 22h00
  3. [XL-2007] copier une plage pour chaque jour du mois
    Par breiz56 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/12/2010, 22h21
  4. [Requete] Calcul Somme entre deux temps pour chaque jour
    Par nico33307 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/03/2006, 00h58
  5. Chaque jour de la semaine de la nième de chaque mois
    Par arsenik7 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 14/03/2006, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo