#1 Mon 28 November 2016 14:46
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
SQLITE problème avec la fonction SUM
Bonjour,
je m'arrache les cheveux sur ce problème que je soumets à la communauté.
J'ai un BSD SQLITE avec des champs importés en FLOAT : ("POP1" FLOAT, "POP2" FLOAT).
Lorsque je veux faire la somme des données de mon champs le résultat obtenu est un entier (la virgule disparaît). SUM("POP1")
Comment faire pour récupérer l'ensemble des données et ne pas perdre des décimales en route ? Pour le moment j'ai essayé de réimporter mes tables en REAL et en NUMERIC mais rien n'y fait. J'ai également essayé avec la fonction TOTAL. Même résultat.
Merci pour votre aide !
Hors ligne
#2 Mon 28 November 2016 15:07
Re: SQLITE problème avec la fonction SUM
Salut,
Il n'y a pas un round() qui traine quelque part ?
Sinon une petite recherche me fait dire que le type float génère des problèmes d'arrondis et qu'il est conseillé d'utiliser un type numeric et donc de caster vos champs
The type DOUBLE is a floating point type represented in binary internally. Binary floating point numbers will produce "rounding errors" when converted to base 10. If you want precise numeric calculations with a decimal point, you'll have to use the NUMERIC or DECIMAL type.
Source : http://dba.stackexchange.com/questions/ … orrect-sum
Dernière modification par heretik25 (Mon 28 November 2016 15:09)
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#3 Mon 28 November 2016 15:14
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: SQLITE problème avec la fonction SUM
Salut,
vous pouvez donner la requête exacte ?
D'après la doc (et un petit test effectué rapidement avec la version 3.13),
le résultat de la somme d'un ensemble de valeur
dont au moins l'une d'entre elle est de type REAL
est bien de type REAL.
Le seul problème que je vois serait effectivement comme le dit heretik, un problème d'arrondi,
mais vous avez apparemment déjà testé la conversion en NUMERIC.
Dernière modification par tumasgiu (Mon 28 November 2016 15:17)
Hors ligne
#4 Mon 28 November 2016 15:33
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
Merci pour ces premières infos.
Voici la requête complète :
CREATE TABLE DEP AS
SUM(SERIE_HIST_2013.P13_RP),
SUM(SERIE_HIST_2013.P08_RP)
FROM SERIE_HIST_2013
WHERE
SERIE_HIST_2013.DEP = '73';
L'idée est de récupérer les infos de la population sur l'ensemble du département.
La structure de la table SERIE_HIST_2013 est la suivante :
CREATE TABLE "SERIE_HIST_2013" ("CODGEO" TEXT PRIMARY KEY NOT NULL UNIQUE , "DEP" TEXT, "P13_POP" NUMERIC, "P08_POP" NUMERIC)
Hors ligne
#5 Mon 28 November 2016 16:12
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: SQLITE problème avec la fonction SUM
Vous pouvez tenter un
Code:
SELECT typeof(SUM(SERIE_HIST_2013.P13_RP)), typeof(SUM(SERIE_HIST_2013.P08_RP)) FROM SERIE_HIST_2013 WHERE SERIE_HIST_2013.DEP = '73';
pour connaitre le type de retour de vos sommes ?
Edit:
La différence entre le nom des champs dans la somme et la table
est elle une faute de frappe ?
Dernière modification par tumasgiu (Mon 28 November 2016 16:22)
Hors ligne
#6 Mon 28 November 2016 16:26
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
Merci.
Oui la différence est une erreur de frappe
Le type de mes sommes est REAL.
Dernière modification par vince100 (Mon 28 November 2016 16:28)
Hors ligne
#7 Tue 29 November 2016 10:03
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: SQLITE problème avec la fonction SUM
Et avec quoi visualisez vous vos résultats ?
Si comme moi vous utilisez sqlite manager (plugin firefox),
si un réel ne comporte que des zéros dans sa partie décimale
alors celle ci est tronquée à l'affichage.
Hors ligne
#8 Tue 29 November 2016 10:08
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
J'utilise SQLite, mais je n'ai strictement aucune décimale qui apparaît lorsque j'utilise SUM.
Lorsque j'observe la structure de la table crée à l'aide de SUM, le TYPE de mes champs n'est pas renseigné (voir capture d'écran).
Hors ligne
#9 Tue 29 November 2016 11:19
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: SQLITE problème avec la fonction SUM
Il faut savoir que le type des données dans SQLite est dynamique,
contrairement à la majorité des autres RDBM, qui ont eux opté
pour un typage statique.
https://www.sqlite.org/datatype3.html
Une colonne d'une table SQLite n'a donc pas de type mais une affinité,
c'est à dire un type de données préferé, mais on peut stocker des données
de différent typesdans une même colonne.
La fonction sum pouvant renvoyer soit un entier soit un réel, en fonction
de son entrée, SQLite ne doit pas chercher à typer le résultat, et donc
ne fournit aucun type pour les colonnes lors de la création de la table.
Pour forcer le typage vous pouvez modifier votre requête :
Code:
SELECT CAST(SUM(ma_colonne) AS FLOAT) --pour chaque appel de la fct sum.
Mais je ne sais pas si çà résoudra le problème.
Dernière modification par tumasgiu (Tue 29 November 2016 11:34)
Hors ligne
#10 Tue 29 November 2016 11:49
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
J'ai effectivement essayé de caster mon opération mais rien n'y fait...
Je suis sur que lorsque j'effectue ma SOMME ou mon TOTAL, SQLite ne prends pas en compte mes décimales (j'ai vérifié directement depuis mon tableur excel) ce qui fausse mon résultat.
Hors ligne
#11 Tue 29 November 2016 15:18
Re: SQLITE problème avec la fonction SUM
J'ai effectivement essayé de caster mon opération mais rien n'y fait...
Je suis sur que lorsque j'effectue ma SOMME ou mon TOTAL, SQLite ne prends pas en compte mes décimales (j'ai vérifié directement depuis mon tableur excel) ce qui fausse mon résultat.
Et si vous utilisez un round() a 3 chiffres par exemple ?
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#12 Tue 29 November 2016 15:26
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
J'ai testé ceci :
Code:
CREATE TABLE DEP AS SELECT TOTAL(ROUND (CC73.P13_RP,6)) AS NUMERIC, TOTAL (ROUND(CC73.P08_RP,6)) AS NUMERIC FROM CC73 WHERE CC73.DEP = '73';
Mais rien n'y fait...
Hors ligne
#13 Tue 29 November 2016 18:07
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: SQLITE problème avec la fonction SUM
Bonjour,
C'est très étonnant comme problème, je viens de tester avec sqlite, aucun souci de mon côté, j'ai bien toutes les décimales.
Peut-on voir toutes les valeurs CC73.P08_RP et CC73.P13_RP du département 73 ?
Et je ne comprends pas bien l'intérêt des 'AS NUMERIC' dans la requête précédente. Si c'était pour changer le type, il manque CAST.
Hors ligne
#14 Tue 29 November 2016 19:39
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
Je poste en PJ une capture d'écran de ma table.
Pour info la commande SQL qui a crée l'objet :
Code:
CREATE TABLE "seriehist" ("CODGEO" TEXT PRIMARY KEY NOT NULL UNIQUE , "REG" TEXT, "REG2016" TEXT, "DEP" TEXT, "LIBGEO" TEXT, "P13_POP" NUMERIC, "P08_POP" NUMERIC, "D99_POP" NUMERIC, "D90_POP" NUMERIC, "D82_POP" NUMERIC, "D75_POP" NUMERIC, "D68_POP" NUMERIC, "SUPERF" NUMERIC, "NAIS0813" NUMERIC, "NAIS9908" NUMERIC, "NAIS9099" NUMERIC, "NAIS8290" NUMERIC, "NAIS7582" NUMERIC, "NAIS6875" NUMERIC, "DECE0813" NUMERIC, "DECE9908" NUMERIC, "DECE9099" NUMERIC, "DECE8290" NUMERIC, "DECE7582" NUMERIC, "DECE6875" NUMERIC, "P13_LOG" NUMERIC, "P08_LOG" NUMERIC, "D99_LOG" NUMERIC, "D90_LOG" NUMERIC, "D82_LOG" NUMERIC, "D75_LOG" NUMERIC, "D68_LOG" NUMERIC, "P13_RP" NUMERIC, "P08_RP" NUMERIC, "D99_RP" NUMERIC, "D90_RP" NUMERIC, "D82_RP" NUMERIC, "D75_RP" NUMERIC, "D68_RP" NUMERIC, "P13_RSECOCC" NUMERIC, "P08_RSECOCC" NUMERIC, "D99_RSECOCC" NUMERIC, "D90_RSECOCC" NUMERIC, "D82_RSECOCC" NUMERIC, "D75_RSECOCC" NUMERIC, "D68_RSECOCC" NUMERIC, "P13_LOGVAC" NUMERIC, "P08_LOGVAC" NUMERIC, "D99_LOGVAC" NUMERIC, "D90_LOGVAC" NUMERIC, "D82_LOGVAC" NUMERIC, "D75_LOGVAC" NUMERIC, "D68_LOGVAC" NUMERIC, "P13_PMEN" NUMERIC, "P08_PMEN" NUMERIC, "D99_PMEN" NUMERIC, "D90_NPER_RP" NUMERIC, "D82_NPER_RP" NUMERIC, "D75_NPER_RP" NUMERIC, "D68_NPER_RP" NUMERIC)
Hors ligne
#15 Tue 29 November 2016 23:42
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
Pour info j'utilise ce jeux de données :
J'importe mon fichier CSV dans ma base SQlite depuis SQlite Manager. Au cours de l'export il me demande si je veux modifier mes données et j'indique à SQlite la nature de mes données (TEXT, NUMERIC..) ainsi que le champ PRIMARY KEY et UNIQUE.
Lorsque j'observe la structure de ma table, j'observe ceci :
Code:
CREATE TABLE "base-cc-serie-historique" ("CODGEO" TEXT PRIMARY KEY NOT NULL UNIQUE , "REG" TEXT, "REG2016" TEXT, "DEP" TEXT, "LIBGEO" TEXT, "P13_POP" NUMERIC, "P08_POP" NUMERIC, "D99_POP" NUMERIC, "D90_POP" NUMERIC, "D82_POP" NUMERIC, "D75_POP" NUMERIC, "D68_POP" NUMERIC, "SUPERF" NUMERIC, "NAIS0813" NUMERIC, "NAIS9908" NUMERIC, "NAIS9099" NUMERIC, "NAIS8290" NUMERIC, "NAIS7582" NUMERIC, "NAIS6875" NUMERIC, "DECE0813" NUMERIC, "DECE9908" NUMERIC, "DECE9099" NUMERIC, "DECE8290" NUMERIC, "DECE7582" NUMERIC, "DECE6875" NUMERIC, "P13_LOG" NUMERIC, "P08_LOG" NUMERIC, "D99_LOG" NUMERIC, "D90_LOG" NUMERIC, "D82_LOG" NUMERIC, "D75_LOG" NUMERIC, "D68_LOG" NUMERIC, "P13_RP" NUMERIC, "P08_RP" NUMERIC, "D99_RP" NUMERIC, "D90_RP" NUMERIC, "D82_RP" NUMERIC, "D75_RP" NUMERIC, "D68_RP" NUMERIC, "P13_RSECOCC" NUMERIC, "P08_RSECOCC" NUMERIC, "D99_RSECOCC" NUMERIC, "D90_RSECOCC" NUMERIC, "D82_RSECOCC" NUMERIC, "D75_RSECOCC" NUMERIC, "D68_RSECOCC" NUMERIC, "P13_LOGVAC" NUMERIC, "P08_LOGVAC" NUMERIC, "D99_LOGVAC" NUMERIC, "D90_LOGVAC" NUMERIC, "D82_LOGVAC" NUMERIC, "D75_LOGVAC" NUMERIC, "D68_LOGVAC" NUMERIC, "P13_PMEN" NUMERIC, "P08_PMEN" NUMERIC, "D99_PMEN" NUMERIC, "D90_NPER_RP" NUMERIC, "D82_NPER_RP" NUMERIC, "D75_NPER_RP" NUMERIC, "D68_NPER_RP" NUMERIC)
Hors ligne
#16 Tue 29 November 2016 23:58
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
Pour info j'utilise ce jeux de données : https://we.tl/R7UesU6Arc
J'importe mon fichier CSV dans ma base SQlite depuis SQlite Manager. Au cours de l'export il me demande si je veux modifier mes données et j'indique à SQlite la nature de mes données (TEXT, NUMERIC..) ainsi que le champ PRIMARY KEY et UNIQUE.
Lorsque j'observe la structure de ma table, j'observe ceci :
Code:
CREATE TABLE "base-cc-serie-historique" ("CODGEO" TEXT PRIMARY KEY NOT NULL UNIQUE , "REG" TEXT, "REG2016" TEXT, "DEP" TEXT, "LIBGEO" TEXT, "P13_POP" NUMERIC, "P08_POP" NUMERIC, "D99_POP" NUMERIC, "D90_POP" NUMERIC, "D82_POP" NUMERIC, "D75_POP" NUMERIC, "D68_POP" NUMERIC, "SUPERF" NUMERIC, "NAIS0813" NUMERIC, "NAIS9908" NUMERIC, "NAIS9099" NUMERIC, "NAIS8290" NUMERIC, "NAIS7582" NUMERIC, "NAIS6875" NUMERIC, "DECE0813" NUMERIC, "DECE9908" NUMERIC, "DECE9099" NUMERIC, "DECE8290" NUMERIC, "DECE7582" NUMERIC, "DECE6875" NUMERIC, "P13_LOG" NUMERIC, "P08_LOG" NUMERIC, "D99_LOG" NUMERIC, "D90_LOG" NUMERIC, "D82_LOG" NUMERIC, "D75_LOG" NUMERIC, "D68_LOG" NUMERIC, "P13_RP" NUMERIC, "P08_RP" NUMERIC, "D99_RP" NUMERIC, "D90_RP" NUMERIC, "D82_RP" NUMERIC, "D75_RP" NUMERIC, "D68_RP" NUMERIC, "P13_RSECOCC" NUMERIC, "P08_RSECOCC" NUMERIC, "D99_RSECOCC" NUMERIC, "D90_RSECOCC" NUMERIC, "D82_RSECOCC" NUMERIC, "D75_RSECOCC" NUMERIC, "D68_RSECOCC" NUMERIC, "P13_LOGVAC" NUMERIC, "P08_LOGVAC" NUMERIC, "D99_LOGVAC" NUMERIC, "D90_LOGVAC" NUMERIC, "D82_LOGVAC" NUMERIC, "D75_LOGVAC" NUMERIC, "D68_LOGVAC" NUMERIC, "P13_PMEN" NUMERIC, "P08_PMEN" NUMERIC, "D99_PMEN" NUMERIC, "D90_NPER_RP" NUMERIC, "D82_NPER_RP" NUMERIC, "D75_NPER_RP" NUMERIC, "D68_NPER_RP" NUMERIC)
Hors ligne
#17 Wed 30 November 2016 09:10
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: SQLITE problème avec la fonction SUM
Bonjour,
J'ai essayé de mon côté d'importer le même jeu de données avec spatialite-gui. Malgré les bonnes options renseignées lors de l'import, il importe les valeurs avec des virgules... Du coup lors des sommes, il les traite comme du texte en s'arrêtant à la virgule, donc ne traite que la partie entière. Donc la somme est fausse et bien-sûr entière.
Vite fait une solution dans ta requête de somme (tu remplaces la virgule par un point) :
Code:
select sum(replace(P13_RP,',','.')) from "base-cc-serie-historique" WHERE DEP = '73';
Hors ligne
#18 Wed 30 November 2016 11:51
- vince100
- Participant actif
- Date d'inscription: 8 Oct 2013
- Messages: 83
Re: SQLITE problème avec la fonction SUM
Merci Lsam !
Effectivement il s'agissait d'une mauvaise importation des données dans SQlite. En remplaçant la virgule par un point comme délimiteur des décimales tout rentre dans l'ordre !
Merci à tous pour votre aide.
Hors ligne
#19 Thu 01 December 2016 08:56
Re: SQLITE problème avec la fonction SUM
Quelle enquête rondement menée !
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne