Bonjour,
Je travaille avec un logiciel qui stocke, comme un goret, et comme tant d'autres… des prix et montants de commandes dans des colonnes de type "float" et non "decimal".
Le programme, qui se contrefout royalement de toutes les formes normales qui soient, stocke dans l'entête de commande le montant de la commande, et sur les lignes, notamment le montant de la ligne (qui est bien évidement le résultat d'un calcul).
Et vu que la vie est bien faite, le programme a foiré ses calculs, et bibi doit corriger à la main les données.
Bref.
Soit les deux tables suivantes :
ENTETE (entete_id, total, valeur_brute)
LIGNE (ligne_id, entete_id, quantite_vendue, quantite_gratuite, prix_unitaire, prix_total, valeur_totale)
Lorsque je fais la requête suivante :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 select ligne_id from ligne where (quantite_vendue + quantite_gratuite) * prix_unitaire <> valeur_totale
J'ai des lignes.
Sauf que 99% des lignes sont "visuellement" identiques. 12,5 dans les deux colonnes.
Evidement, y'en a une qui doit être égale à 12,49999999999 et l'autre à 12,50000000001 donc elles ne sont pas égales.
Idem lorsque je contrôle que la somme des lignes est égale au montant de l'entête.
Je m'en suis sorti avec une pirouette à deux balles qui consiste à comparer non pas les valeurs dans leur type d'origine, mais les convertir à la volée en decimal(12,2) histoire que 12,5 = 12,5
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 select ligne_id from ligne where cast((quantite_vendue + quantite_gratuite) * prix_unitaire as decimal(12,2)) <> cast(valeur_totale as decimal(12,2))
Mais je trouve pas ça propre. Si par hasard j'ai un prix avec une précision non pas à deux décimales mais à 5, mon truc marche pas.
Et caster à la volée toutes les données me semble relativement moyen…
Je pensais aussi faire :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 select ligne_id from ligne where abs((quantite_vendue + quantite_gratuite) * prix_unitaire - valeur_totale) > 0.000001
Mais bon, ça devient juste plus lisible…
Existe-t-il sous SQL Server un flag ou autre fonction qui transforme le "=" en "= au pouillème près" afin de faire abstraction des erreurs de précision du type float ?
Partager