Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/03/2011, 12h08   #1
Invité de passage
 
Femme
Étudiant
Inscription : mars 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Par défaut somme sur plusieurs champs et mise à jour du champ correspondant

Bonjour à tous

Est ce qu'on peut m'aider sur cette requête:

Code :
1
2
3
UPDATE actifs 
SET total = SUM(imm_nettes + imm_financieres + autresANC + stocks + clientsEtComptes + autresActifsCourants + placements + liquiditeEtEquivalentDeLiquidite) 
WHERE an IN (2009, 2010);
Merci d'avance
rannou2609 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 13h43   #2
Membre du Club
 
Inscription : août 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 66
Points : 69
Points : 69
Quel problème rencontres-tu avec cette requête ?
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 16h52   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Si une des colonnes imm_nettes , imm_financieres , autresANC , stocks , clientsEtComptes , autresActifsCourants , placements , liquiditeEtEquivalentDeLiquidite est NULL, le résultat sera faux, j'imagine que c'est ça le problème ?
A lire autour des NULL

Utilise COALESCE, ex: COALESCE(placements,0) pour chaque colonne
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 15h11   #4
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Par défaut c'est une erreur de synthaxe (SUM => agrégation)

Bonjour,
SUM sert lorsqu'on agrège les données avec GROUP BY, cela sert à faire la somme des différentes lignes sur une seule colonne.
Ici je pense que vous voulez simplement additionner les valeurs d'autres colonnes de la table, dans ce cas inutile de mettre SUM qui n'a rien à faire ici, on indique simplement le nom des colonnes.
Cependant je doute qu'ajouter cette colonne soit très judicieux, cela prend de la place sur le disque et en mémoire et si jamais la valeur d'une des colonnes change le total n'est plus bon (à moins de mettre un trigger). Il vaut mieux le faire dynamiquement dans une vue ou encore directement dans le programme qui utilise les données.
Bon courage
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 20h24   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Effectivement il y a une erreur de syntaxe, mais un SUM sans GROUP BY est tout à fait valide syntaxiquement tant que ça répond au besoin...

Ici il faudrait écrire :
Code :
1
2
3
UPDATE actifs 
SET total = (SELECT SUM(imm_nettes + imm_financieres + autresANC + stocks + clientsEtComptes + autresActifsCourants + placements + liquiditeEtEquivalentDeLiquidite) FROM actifs WHERE an IN (2009, 2010))
WHERE an IN (2009, 2010);
Mais effectivement le SUM n'est peut être pas nécessaire dans le cas présent et je suis tout à fait d'accord que le besoin d'UPDATE est douteux, le conseil de la vue étant très bon et sûrement la méthode à adopter.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 20h51   #6
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Oui, effectivement, on peut faire un SUM sans le GROUP BY mais seulement si on veut avoir le total de toutes les lignes, sans regroupement.
Là, à mon avis, ce n'est pas ce qu'on veut, c'est assez bizarre de vouloir ajouter une colonne avec le total de plusieurs colonnes sur l'ensemble des lignes ...
Je pense vraiment qu'il y a confusion, j'avais fait de même au tout début quand j'ai appris sql, je pensais à la fonction sum de Excel, j'ai l'impression que c'est le même cas ici. Il nous faut plus d'informations de rannou2609.
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 09h53   #7
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Citation:
Envoyé par skuatamad Voir le message
Effectivement il y a une erreur de syntaxe, mais un SUM sans GROUP BY est tout à fait valide syntaxiquement tant que ça répond au besoin...
Ouh là... Pas vraiment, non... MySQL est sans doute le seul SGBD à tolérer cette syntaxe, ce qui est d'ailleurs très souvent source d'erreurs.
Un peu de lecture sur le sujet : http://cedric-duprez.developpez.com/...fier-group-by/

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 11h06   #8
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Je ne comprends pas, on peut faire qq chose comme :
Code :
1
2
 
SELECT SUM(colonne1) FROM matable
A partir du moment où on ne veut pas de regroupement pour faire des sous totaux, il n'y a pas de problème, je le faisais sous Sql Server sans soucis. Là où cela ne va pas, c'est quand on ajoute des colonnes de la table sur lesquelles on ne fait pas d'opérations d'agrégation, là alors que Mysql s'en fiche, Sql Server refuse en indiquant que ces colonnes doivent apparaitre dans le GROUP BY.
Je me trompe ?
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h11   #9
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
A mon avis ced a lu trop vite ce que j'ai écrit. En tout cas je connais très bien cet article auquel je me réfère souvent dans mes réponses sur le forum mysql
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h28   #10
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Je pense qu'il fait allusion à "l'erreur" de Mysql dans l'utilisation des GROUP BY.
Moi même, j'ai commencé par Sql Server, lorsque je suis arrivé sur Mysql je n'ai pas compris ce que disait les autres.
Le problème est que beaucoup de monde commence avec Mysql, du coup ils prennent de mauvaises habitudes avec cette mauvaise syntaxe.
Dans une base autre de Mysql, la requête comprend deux éléments :
- les colonnes sur lesquelles on opère les calculs avec SUM, COUNT, AVG, etc
- les colonnes qui servent à regrouper les résultats en sous totaux
Toutes ces dernières colonnes doivent apparaître dans le GROUP BY, c'est obligatoire.
Dans Mysql, le moteur ne nous oblige pas de le faire, mais attention le résultat n'est pas le même. Le regroupement pour les calculs ne se fait que si on a précisé la colonne dans GROUP BY. A défaut j'ai remarqué que Mysql indiquait la première valeur rendue dans la requête sans le GROUP BY, c'est donc une valeur aléatoire, qui peut être bonne comme fausse.
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h55.


 
 
 
 
Partenaires

Hébergement Web