[RESOLU] SUM & INNER

SUM & INNER [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 12-09-2014 à 09:24:30    

Bonjour,
 
n'ayant pas la maîtrise d'SQL, je tourne un peu rond pour cette requête...
 
J'ai 3 tables
- calendrier  
- stages
- bilan2014
 
la clé REF commune a ces tables.
 
Je voudrais présenter un tableau:
 
----------------------------------------------------------
***     REFXXX   ***    RECETTE   ***   DEPENSES          -
----------------------------------------------------------
 
Donc j'ai fait la requête
 
 
SELECT calendrier.REF, SUM(stages.RECETTE) AS recette, SUM(bilan2014.montant) AS depenses
FROM stages,calendrier,bilan2014  
WHERE calendrier.REF=stages.REF
AND Conditions.............  
GROUP BY calendrier.REF
Les résultats s'affichent avec des erreurs de montant dans les SUM.
 
Cette piste est-elle bonne? :??:  
Merci pour votre aide. ;)


Message édité par hogz le 17-09-2014 à 07:26:19
Reply

Marsh Posté le 12-09-2014 à 09:24:30   

Reply

Marsh Posté le 12-09-2014 à 10:02:34    

Le code qui est montré semble correct, à condition que les données dans stages.RECETTE et bilan2014.montant soient bien des nombres (pas des données nulles, par exemple).
 
Il faudrait tester sans mettre les sum() et sans le group by, parce que ça pourrait aider à détecter un problème.

Reply

Marsh Posté le 12-09-2014 à 12:54:03    

Merci pour la réponse...
- stages.RECETTE les valeurs sont toujours un chiffre (pas de ligne à 0)
- bilan2014.montant soit un chiffre soit 0

Reply

Marsh Posté le 15-09-2014 à 12:34:15    

hogz :
dans ta requete :
SELECT calendrier.REF, SUM(stages.RECETTE) AS recette, SUM(bilan2014.montant) AS depenses
FROM stages,calendrier,bilan2014  
WHERE calendrier.REF=stages.REF
AND Conditions.............  
GROUP BY calendrier.REF
tu joins 3 tables ... et tu n'écris la jointure que de 2...
C'est pas tout simplement ça?

 

Perso,
moi j'écris mes jointures avec inner, left join ,exception join
je trouve ça plus claire à écrire, à comprendre et surtout plus simple à débugger...

 

Guillaume


Message édité par gpl73 le 15-09-2014 à 12:46:48

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 15-09-2014 à 15:05:17    

Merci pour ta réponse,
 
non, vraiment j'avais essayé  
WHERE calendrier.REF=stages.REF=bilan2014
 
J'ai même essayé
calendrier.REF=stages.REF AND calendrier.REF=bilan2014
 
j'ai aussi réduit mes Conditions pour avancer, mais résultats inexactes.
 
- montant et depenses sont en DECIMAL 10,2
 
J'ai même essayé sur montant quand le champ indiquait 0 mettre dans la condition IS NOT NULL afin de réduire...
 
C'est vrais les jointures s'écrivent en INNER JOIN ou JOIN mais bon là j'ai pris un raccourci :)

Reply

Marsh Posté le 15-09-2014 à 15:27:07    

Comme tu jointes sur 2 tables différentes pour tes SUM, peut être que tu as des résultats multiples et du coup il t'additionne plusieurs fois les colonnes ?
 
/my 2 cent


---------------
D3
Reply

Marsh Posté le 15-09-2014 à 15:39:24    

Oui, ça viens surement des SUM...Mais j'ai cherché comment l'écrire pour l'instant je bute....
J'ai essayé de mettre des conditions aux SUM...Pas bon!!! :pt1cable:

Reply

Marsh Posté le 15-09-2014 à 15:51:08    

sous requête ou union ?


---------------
D3
Reply

Marsh Posté le 17-09-2014 à 07:24:45    

Résolu avec INNER JOIN et COALESCE.... :bounce:

Reply

Marsh Posté le 18-09-2014 à 08:30:42    


le coalesce gère juste le fait que ta valeur soit null ou pas... (tu as aussi ifnull(CHAMP, Valeur de remplacement))

 

ce sont tes jointures qui n'étaient pas bonnes :)
le fait d'écrire des inner join fait que tu vois mieux les jointures...
tu as 3 tables avec Ref comme clé,
mais dans ta clause where :
___________________________________
WHERE calendrier. REF=stages.REF
AND Conditions.............  
GROUP BY calendrier. REF
___________________________________
tu ne fais qu'une jointure sur calendrier et stages...
donc produit cartésien sur la troisième table...
et donc des totaux farfelus...
il faut :
________________________________________________
tu y étais presque:
________________________________________________
J'ai même essayé
calendrier.REF=stages.REF AND calendrier.REF=bilan2014
_________________________________________________

 

WHERE
calendrier. REF=stages.REF
and
calendrier.REF=bilan2014.REF (ou stages.REF = bilan2014.REF, à toi de voir)
and
tes conditions ...

 

NB: Faire une table bilan avec un nom qui correspond à l'année, c'est pas terrible , lol... car l'année prochaine, tu fais quoi? tu modifies toute ta BD et ton application avec une table bilan2015?

 


Message édité par gpl73 le 18-09-2014 à 08:33:29

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed