Moyenne sur plusieurs colonnes enum [résolu] - SQL/NoSQL - Programmation
Marsh Posté le 19-02-2007 à 17:19:30
déjà, AVG et autres marchent sur des LIGNES et non des colonnes.
modifie donc la structure de ta table afin d'avoir 7 lignes et non 7 colonnes
un NULL est ignoré par AVG lors du calcul. Ainsi il te suffit de replacer NC par NULL dans la requête, et le tour est joué.
Marsh Posté le 19-02-2007 à 17:25:27
Ok, merci de ta réponse MagicBuzz.
Mais n'y a t'il vraiment pas d'autre choix que de devoir modifier la structure de ma table?
(c'est une structure commune a plusieurs developpeurs qui font parti de mon groupe de travail et ca m'embeterai vraiment de leur imposer de changer de modèle).
D'autre part, je remplace comment NC par NULL dans la requete?
Marsh Posté le 19-02-2007 à 17:52:39
replace(champ, 'NC', null)
sinon, tu peux passer par une vue qui permet de faire la mise en lignes de tes colonnes si tu ne peux pas toucher à la structure.
Marsh Posté le 19-02-2007 à 18:53:27
Merci, ca débroussaille déjà un peu le problème!!
Reste qu'a trouver comment je fais "une vue qui permet de faire la mise en lignes de tes colonnes".
Tu aurai un exemple/une ébauche de requete a me proposer?
Marsh Posté le 19-02-2007 à 19:04:00
ben... y'a pas 36 solution : 7 union de suite qui prennent chacun une colonne... et qui rajoutent un champ "en dur" correspondant au numéro de colonne.
genre :
|
Marsh Posté le 19-02-2007 à 19:09:19
sinon si le decode existe en mysql un truc pas joli du genre:
Code :
|
devrait le faire, je te laisse le soin de prendre en charge l'éventuelle division par 0
c'est moche mais bon on est pas toujours la pour faire de l'alexandrin
Marsh Posté le 19-02-2007 à 19:28:20
Le code de test complet et corrigé (SQL Server Express 2005) :
|
Résultat :
|
Marsh Posté le 19-02-2007 à 19:29:28
casimimir a écrit : sinon si le decode existe en mysql un truc pas joli du genre: (DECODE) |
decode existe sous MySQL, mais ça sert à changer l'encodage d'une chaîne de caractère.
il faut utiliser CASE à la place, comme dans mon exemple SQL Server.
Marsh Posté le 19-02-2007 à 19:30:03
t'ain, y'avais que 4 colonnes, et dire que je me suis fait chier à en faire 7
Marsh Posté le 19-02-2007 à 19:34:56
ho en oracle le decode c'est un beau fourre tout il arrive toujours a caster et retrouver ses jeunes ^^
j'avais la flemme de me faire un case et avec mysql je sais jamais ce qui est supporté et je me disais qu'il y avait peut-etre une syntaxe bionique
Marsh Posté le 19-02-2007 à 19:44:03
bah non parceque decode() est déjà utilisé par une fonction inutile de mysql
mais sinon, le case est pas mal aussi, et même s'il est plus lourd, bien plus lisible car il est indentable proprment
Marsh Posté le 19-02-2007 à 19:53:10
Ok nickel, je viens de tester tout ca, ca marche impec! Merci beaucoup!
Marsh Posté le 19-02-2007 à 17:13:56
Bonjours à tous.
Je dispose d'une table myslq avec les champs classement_1, classement_2, classsment_3, classement_4. Ces champs sont de type ENUM et peuvent prendre les valeurs 0,1,2,3,4,5,6,7 ou 'NC' (pour non classé).
Je souhaiterai faire la moyenne pour chaque enregistrement de ces colonnes, mais en ne tenant pas compte des NC (c'est à dire en ne les incluant pas dans la moyenne).
Par exemple:
id: 1 classement_1: NC classement_2: 3 classement_3: 7 classement_4: 2
renverra (3+7+2)/3 = 4
mais celui ci:
id: 2 classement_1: 5 classement_2: 3 classement_3: 7 classement_4: 2
renverra (5+3+7+2)/4 = 4,25
J'ai essayé sans grand succès de combiner des AVG, GROUP BY et sous requetes ... sans grand succès, et google ne m'aide pas beaucoup non plus!
Bref, auriez vous une idée de comment on peut faire ca en mysql?
Merci beaucoup!
Clem
Message édité par sazeod le 19-02-2007 à 19:53:31