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 :

SUM sur une colonne FLOAT


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Points : 73
    Points
    73
    Par défaut SUM sur une colonne FLOAT
    Bonjour, je sais que ce sujet a été mainte fois abordé et je connais la solution au problème : le type DECIMAL.
    Mais ici je voudrais comprendre un comportement bizarre de Mysql : le même calcul sur deux tables IDENTIQUES à part le nom me renvoie deux résultats différents !?

    Je vous donne le contexte :
    Une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'ecriture' {INT date, INT metier, INT champ, FLOAT val}
    sur laquelle je faisais des SUM(val) très simples selon différentes valeurs de date et champ.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT SUM(val) FROM ecriture
    WHERE date='2011-01-28' AND metier='20001'.
    Ayant constaté des erreurs dans les résultats, j'ai supposé que le type FLOAT en était responsable et ai voulu modifier la colonne pour la changer en DECIMAL.

    Pour être sûr de ne rien perdre de mes données, j'ai d'abord exporté ma table en SQL avec PhpMyAdmin puis je l'ai appelée ecriture2 dans le fichier .sql et l'ai importée dans la base.

    À ce stade, je n'ai fait AUCUNE modification de type, j'ai donc deux tables ecriture et ecriture2 IDENTIQUES en tous points (données, index, nom des colonnes, ...)

    Et quelle fut ma surprise lorsqu'en essayant mes SUM sur la colonne val de ecriture2, j'obtint le bon résultat !
    N'en croyant pas mes yeux je réessaye sur ecriture ... le résultat est faux.

    Après une dizaine d'essais, je me rend à l'évidence. J'obtiens deux sommes différentes pour la même requete.
    Je suis passé au type DECIMAL et mon problème de départ est résolu mais j'aimerais comprendre ...

  2. #2
    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
    Salut,

    Je pense que ça vient dans la gestion de la précision et des erreurs d'arrondi qui dépend des types et de leur stockage interne...

    Plus on cumule les calculs, plus on obtient des erreurs plus ou moins flagrantes et l'ordre des opérations joue en plus... Par exemple, si tu fais une simple somme d'une liste de valeurs dont tu changes l'ordre, tu peux avoir différents résultats...

Discussions similaires

  1. plusieurs SUM() sur une meme colonne ?
    Par Seb33300 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 15/12/2008, 11h29
  2. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 16h18
  3. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29
  4. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16
  5. Check sur une colonne de table "en cours"
    Par in dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/07/2003, 09h47

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