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 :

Bug: SUM() renvoie le double du résultat attendu


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Par défaut Bug: SUM() renvoie le double du résultat attendu
    Bonjour,

    j'ai une table MySQL contenant des enregistrememnts de floats(environ 10 000 enregistrements) quand je tente de faire la somme de ces 10 000 enregistrement par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sum(enregistrement) 
    from table ma_table 
    where date_transfert like 'aaaa-mm-jj %';
    cette commande me renvoie toujours le double de la somme attendue (genre 1500 au lieu de 750).

    est-ce que quelqu'un saurait d'où vien le problème? (à part le problème que je suis nul en BDD )

    merci!

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Bizarre en effet !

    1/ fais-tu réellement une requete aussi simple que celle que tu as postée (pas de jointure ? ça sent le produit cartésien ! )

    2/ comment fais-tu pour calculer le résultat attendu ?

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Par défaut
    Bonjour aieeeuuuuu,

    en fait j'ai un peu simplifié la requête, mais d'ans l'esprit c'est ça... mais si tu veux voici la vrai synthaxe exacte que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select sum(puissance_AC/1000) 
    from day_ond 
    where adr_ond like '1' 
      and date_transfert like '2011-01-27 %';
    mais je dois expliquer tout depuis le début, tu vas comprendre:

    j'ai deux tables:
    - ond: qui archive les données du jour courant
    - day_ond: qui archive les données de tous les jours depuis le 2010-11-01

    nous sommes le jour n:

    quand je fais l'opération de somme sur la table ond
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sum(puissance_AC/1000) 
    from ond 
    where adr_ond like '1';
    j'obtiens alors : 800.

    maintenant nous sommes le jour n+1, les données de la table ond sont maintenant archivées dans la tables day_ond:

    je fais alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select sum(puissance_AC/1000) 
    from day_ond 
    where adr_ond like '1' 
      and date_transfert like '2010-01-27 %';
    . j'obtiens maintenant : 1600.

    voilà!

    (je sais pas pour toi, mais moi je trouve ça très bizarre)

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    C'est pour ca que je te demandais comment tu faisais pour vérifier !

    Es-tu sur que le problème ne vient pas plutôt de l'opération d'archivage, qui insère deux fois par exemple ?

    est-ce qu'un count(*) ne te renvoi pas également le double du nombre de lignes ?

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Par défaut
    Bonjour,

    moi aussi j'ai pensé à ça, mais non.... les archves sont sauvegardées 1 fois pas 2.
    et le count me renvoie le nombre exact.

    une autre idée?
    merci

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Tu lances tes requêtes directement sur le serveur ou via un logiciel ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par K2000 Voir le message
    Bonjour aieeeuuuuu,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select sum(puissance_AC/1000) 
    from day_ond 
    where adr_ond like '1' 
      and date_transfert like '2011-01-27 %';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select sum(puissance_AC/1000) 
    from day_ond 
    where adr_ond like '1' 
      and date_transfert like '2010-01-27 %';

    Je reviens dessus, je viens de voir que l'année n'est pas la même dans les deux requêtes... est-ce juste une erreur de copier/coller ?
    (je suppose, vu que tu dis que les données sont archivées depuis le 2010-11... mais ca vaut le coup de vérifier )

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Par défaut
    Bonjour à tous,

    @ CinePhil: Non, je n'utilise pas de logiciel particulier, je suis sur Mysql, et je lance mes requêtes à partir de ma console linux, et j'obtient les mêmes résultats lorsque je lance ces requêtes à partir de scripts php.

    @aieeeuuuuu : oui oui il s'agis bien d'une erreur de frappe... je voulais dire 2011

    d'autres idées?

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    non aucune !

    pour pouvoir avancer, à ce stade, il nous faudrait au moins :

    1/ La DDL des tables
    2/ ta procédure d'archivage
    3/ un jeu d'essai éventuellement

    Et surtout, donne des vrais données, pas des exemples interprétés, car vu le type de problème, je pense que c'est un petit détail...

    Si tu remet que des exemples pour le principe de fonctionnement, tu va masquer ce petit problème !

    En effet, des choses me surprennent dans ce que tu dis :
    tu dis que ta colonne puissance_AC est de type float, mais dans les exemples que tu donnes, même après division par 1000, tu tombe encore sur des comptes drôlement rond : 800, 1600, ...

    PS: essaie sans la division par 1000 pour voir si tu as le même résultats.

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour

    Bizarre en effet !

    1/ fais-tu réellement une requete aussi simple que celle que tu as postée (pas de jointure ? ça sent le produit cartésien ! )

    2/ comment fais-tu pour calculer le résultat attendu ?

    Je repose la 2éme question de mon premier post !!!

    Si ta procédure d'archivage fait un truncate, comment peux-tu comparer les données entre les deux tables ? car avant l'archivage, elles sont dans la table ond_day, et pas dans ond, et après archivage, c'est l'inverse !

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Par défaut


    vous allez me haïr (autant que moi je me déteste....)

    en fait CinePhil à raison depuis le début!!!

    j'ai effectivement deux archives le même jour je me suis rendu compte que c'est ma crontab qui déconnait! elle faisait deux fois l'archive une à 22h (je ne sais pas pourquoi) et une à 23h (celle que j'ai programmé)

    j'ai effacé tous les doublons présents sur ma table MySQL et maintenant tou rentre dans l'ordre.

    je et je comprend pourquoi le count me retournait un nombre exacte, c'est à cause de l'instruction "groupe by" que je rajouttais, il me retournait donc le bon chiffre...

    je vous remerci chers membres du Forum Developpez .net

    j'éspere que vous n'allez pas me banir du forum à cause du temps perdu que je vous ai causé.

    à charge de revanche j'espère

    a+


  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    ta requête ne fait peu être pas tout a fait ce que tu crois, as tu essayé explain pour voir comment mysql comprend ta requête

    http://dev.mysql.com/doc/refman/5.0/en/explain.html

  14. #14
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    Depuis le début, je lis que c'est le petit résultat qui est le résultat juste. Pourquoi ce ne serai pas le grand résultat?

    On voit clairement dans un des messages ci dessous que la mesure pour deux secondes consécutives sont identiques. Normal? my bad.

    le résultat de ceci?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT date_transfert, sum(Energie_jour)/1000, count(energie_jour)
    FROM day_ond 
    WHERE date_transfert LIKE :pattern 
    GROUP BY date_transfert WITH ROLLUP;

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

Discussions similaires

  1. requete SQL incomplète qui ne renvoie pas le résultat attendu
    Par ballantine's dans le forum Langage SQL
    Réponses: 14
    Dernier message: 07/10/2010, 07h23
  2. Réponses: 2
    Dernier message: 11/12/2006, 19h46
  3. Réponses: 5
    Dernier message: 03/11/2006, 13h23
  4. Concaténation ne donne pas le résultat attendu
    Par artotal dans le forum Langage
    Réponses: 4
    Dernier message: 12/05/2006, 01h37
  5. Réponses: 5
    Dernier message: 19/11/2004, 19h16

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