Erreur Requête Average
Résolu
Esfriert
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
Novice en Bases de données, j'ai créé une base permettant de gérer des Usagers regardant des Series. Ils ont la possibilité de de donner une note (unique) à chaque série, entre 0 et 5.
Ma requête consistait simplement à calculer la moyenne donnée pour chaque série, or la fonction AVG me renvoie des réponses qui sont impossibles.
En voilà un exemple.

La moyenne de la Série est de 4,75.

On voit ici que la réponse est fausse, elle est également impossible puisque la moyenne ne peut être supérieure à 5...
Je n'ai aucune idée de l'origine du problème. J'ai tenté de changer le type de la colonne 'Valeur' en INT ( il est actuellement en ENUM '0','1','2','3','4','5'), mais cela n'a rien résolu...
Merci d'avance pour votre aide.
Novice en Bases de données, j'ai créé une base permettant de gérer des Usagers regardant des Series. Ils ont la possibilité de de donner une note (unique) à chaque série, entre 0 et 5.
Ma requête consistait simplement à calculer la moyenne donnée pour chaque série, or la fonction AVG me renvoie des réponses qui sont impossibles.
En voilà un exemple.


On voit ici que la réponse est fausse, elle est également impossible puisque la moyenne ne peut être supérieure à 5...
Je n'ai aucune idée de l'origine du problème. J'ai tenté de changer le type de la colonne 'Valeur' en INT ( il est actuellement en ENUM '0','1','2','3','4','5'), mais cela n'a rien résolu...
Merci d'avance pour votre aide.
A voir également:
- Erreur Requête Average
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Java code erreur 1603 ✓ - Forum Windows
4 réponses
Je t' assure que le AVG fonctionne parfaitement ... même avec un ENUM et même sans group by (je n'avais pas vu ton WHERE)
Exemple :

Donc.. tu as certainement d'autres lignes dans ta table qui correspondent à ton where...
As tu essayé de faire un truc du genre pour voir ce que ça t'affiche ?
Exemple :
DROP TABLE IF EXISTS `aaa`; CREATE TABLE IF NOT EXISTS `aaa` ( `id` int(11) NOT NULL AUTO_INCREMENT, `titre` varchar(50) DEFAULT NULL, `valeur` enum('1','2','3','4','5') DEFAULT NULL, PRIMARY KEY (`id`), KEY `titre` (`titre`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; INSERT INTO `aaa` (`id`, `titre`, `valeur`) VALUES (1, 'A', '1'), (2, 'A', '1'), (3, 'B', '2'), (4, 'B', '2'), (5, 'C', '5'), (6, 'C', '5'), (7, 'C', '5'), (8, 'C', '4');
SELECT titre, avg(valeur) as MOY FROM aaa WHERE aaa.titre = "C"

Donc.. tu as certainement d'autres lignes dans ta table qui correspondent à ton where...
As tu essayé de faire un truc du genre pour voir ce que ça t'affiche ?
SELECT titre, SUM(valeur) as SOMME , COUNT(valeur) as NB FROM aaa WHERE aaa.titre = "C"
`Notation` -- CREATE TABLE IF NOT EXISTS `Notation` ( `Fk_ID_usager` int(11) NOT NULL, `Fk_titre` varchar(100) CHARACTER SET utf8 NOT NULL, `Valeur` enum('0','1','2','3','4','5') CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`Fk_ID_usager`,`Fk_titre`), KEY `Fk_ID_usager` (`Fk_ID_usager`), KEY `Fk_titre` (`Fk_titre`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Contenu de la table `Notation` -- INSERT INTO `Notation` (`Fk_ID_usager`, `Fk_titre`, `Valeur`) VALUES (1, 'Helix', '1'), (1, 'Jessica Jones', '4'), (1, 'Orphan Black', '3'), (2, 'Helix', '4'), (2, 'Izombie', '5'), (2, 'Jessica Jones', '4'), (2, 'Once Upon A Time', '5'), (2, 'Orphan Black', '5'), (3, 'Orphan Black', '4'), (4, 'Izombie', '5'), (5, 'Jessica Jones', '2'), (6, 'Helix', '3'), (6, 'Orphan Black', '4'), (7, 'Once Upon A Time', '4'), (8, 'Orphan Black', '3'), (9, 'Izombie', '5'), (10, 'Izombie', '3'), (10, 'Once Upon A Time', '5'), (11, 'Helix', '4'), (12, 'Helix', '4'), (12, 'Once Upon A Time', '5'), (13, 'Jessica Jones', '5'), (14, 'Izombie', '2'), (15, 'Jessica Jones', '1'), (16, 'Orphan Black', '1'), (17, 'Jessica Jones', '5');
Voilà toutes les valeurs de ma table 'Notation'. J'ai remarqué que lorsque je demande la moyenne, celle-ci n'est pas complètement fausse à proprement parler, mais il rajoute toujours 1 au calcul. Ainsi, les moyennes pour chaque séries passent de 4,75 à 5,75; de 3,2 à 4,2; etc.
Concernant la requête que tu m'as conseillé de faire, le résultat est intriguant. Il reconnait bien compter quatre valeurs, mais le total n'est pas bon.. Il trouve 23 au lieu de 19, ce qui fait que ma moyenne se décale et passe à 5,75..Mais d'où ça peut bien venir??
Bonsoir
Attention à l'utilisation d'ENUM comme un nombre.
Comme le dit la doc de mysql, les valeurs numériques attribuées aux valeurs d'un ENUM commencent à 1, et non pas à 0
Quand Jordane (que je salue au passage ) définit enum('1','2','3','4','5'), les valeurs numériques correspondantes sont alors (1,2,3,4,5), on a l'impression que tout va bien
Quand Esfriert définit enum('0','1','2','3','4','5'), les valeurs numériques correspondantes sont alors (1,2,3,4,5,6) et la traduction de l'ENUM en nombre donne 1 de plus.
Attention à l'utilisation d'ENUM comme un nombre.
Comme le dit la doc de mysql, les valeurs numériques attribuées aux valeurs d'un ENUM commencent à 1, et non pas à 0
Quand Jordane (que je salue au passage ) définit enum('1','2','3','4','5'), les valeurs numériques correspondantes sont alors (1,2,3,4,5), on a l'impression que tout va bien
Quand Esfriert définit enum('0','1','2','3','4','5'), les valeurs numériques correspondantes sont alors (1,2,3,4,5,6) et la traduction de l'ENUM en nombre donne 1 de plus.
Ça va marcher si tu utilises le type INT ou TINYINT.
Si tu le fais avec phpmyadmin sur une base déjà existante, tu remarqueras que toutes tes valeurs vont augmenter de 1 quand tu remplaceras le type ENUM par un type INT.
Il suffira de faire
Si tu le fais avec phpmyadmin sur une base déjà existante, tu remarqueras que toutes tes valeurs vont augmenter de 1 quand tu remplaceras le type ENUM par un type INT.
Il suffira de faire
UPDATE Notation SET Valeur=Valeur-1pour remettre les bonnes valeurs