J'arrive pas à faire une soustraction pour trouver le solde

Résolu/Fermé
NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019 - Modifié par NanoDev le 26/02/2017 à 10:33
NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019 - 27 févr. 2017 à 14:38
Bonjour et merci d'avance de votre aide ou des pistes,
il s'agit d'une balance, elle doit renvoyer, un colonne unique comportant les numéros de compte, une colonne libellé et une colonne solde.

Cette requête fonctionne mais je ne parviens pas à soustraire la colonne CREDIT par la colonne DEBIT, j'ai tenté de soustraire les deux sous-requêtes, cela fonctionne partiellement car, elle ne génère pas d'erreur mais me renvoie un résultat NULL et c'est normal puisque certains sens ou comptes au débit ou au crédit sont inexistants. J'ai également tenté de faire l'opération dans le Select en écrivant après "F_COMPTEG.CG_Intitule," "(CREDIT)-(DEBIT) AS SOLDE,"
mais ça ne marche pas.

Si vous avez une idée ! Merci d'avance de votre aide ;)



SELECT F_ECRITUREC.CG_Num, F_COMPTEG.CG_Intitule,

(SELECT CASE EC_Sens
WHEN '0' THEN SUM(-EC_Montant)
END)AS DEBIT,

(SELECT CASE EC_Sens
WHEN '1' THEN SUM(EC_Montant)
END) AS CREDIT


FROM F_ECRITUREC, F_COMPTEG

WHERE F_COMPTEG.CG_Num = F_ECRITUREC.CG_Num AND
JM_Date >= '20150101' AND JM_Date <= '20151231'


GROUP BY F_ECRITUREC.CG_Num, F_COMPTEG.CG_Intitule, F_ECRITUREC.EC_Sens
ORDER BY F_ECRITUREC.CG_Num




Code qui renvoie bien le numméro de compte, le libellé, mais un SOLDE null :



(SELECT CASE EC_Sens
WHEN '1' THEN SUM(EC_Montant)
END)-

(SELECT CASE EC_Sens
WHEN '0' THEN SUM(-EC_Montant)
END)AS SOLDE

1 réponse

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
Modifié par yg_be le 26/02/2017 à 11:48
bonjour, moi je supprimerais
EC_Sens
du
GROUP BY
, et je ferais:
SUM((2*EC_Sens-1)*EC_Montant) AS SOLDE
2
NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019
26 févr. 2017 à 12:00
Bien vu, je n'ai pas réussi à modifier mon annonce, en effet, on ne peut pas grouper
ou utiliser Ec_sens dans le group by puisqu'il contient soit 1 soit 2, donc je pensais qu'il fallait aussi le supprimer du select.

Votre proposition fonctionne à merveille ! Je n'en reviens pas !

Merci mille fois, vous êtes un professionnel de SQL ?
0
NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019 > NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019
26 févr. 2017 à 12:12
Voici le requête corrigée par yg_be et qui fonctionne parfaitement :



SELECT F_ECRITUREC.CG_Num, F_COMPTEG.CG_Intitule,
SUM((2*EC_Sens-1)*EC_Montant) AS SOLDE

FROM F_ECRITUREC, F_COMPTEG

WHERE F_COMPTEG.CG_Num = F_ECRITUREC.CG_Num AND
JM_Date >= '20150101' AND JM_Date <= '20151231'

GROUP BY F_ECRITUREC.CG_Num, F_COMPTEG.CG_Intitule
ORDER BY F_ECRITUREC.CG_Num

0
NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019 > NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019
27 févr. 2017 à 12:43
Bonjour
J'ai modifié la requête ainsi et qui fonctionne pour éviter d'avoir des valeur de solde à 0, pas si simple car on ne peut pas utiliser l'alias SOLDE dans le Where... Mais j'aimerai bien comprendre précisément la ligne suivante,



SUM((2*EC_Sens-1)*EC_Montant)



à quoi correspond le 2 l'étoile, le -1 ?




SELECT F_ECRITUREC.CG_Num, F_COMPTEG.CG_Intitule, SUM((2*EC_Sens-1)*EC_Montant) AS SOLDE

FROM F_ECRITUREC, F_COMPTEG

WHERE F_COMPTEG.CG_Num = F_ECRITUREC.CG_Num AND
JM_Date >= '20150101' AND JM_Date <= '20151231'

GROUP BY F_ECRITUREC.CG_Num, F_COMPTEG.CG_Intitule
HAVING SUM((2*EC_Sens-1)*EC_Montant)<>'0'
ORDER BY F_ECRITUREC.CG_Num


0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474 > NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019
Modifié par yg_be le 27/02/2017 à 13:25
bonjour, quelques explications de SUM((2*EC_Sens-1)*EC_Montant):
l'étoile est l'opérateur de multiplication, le moins l'opérateur de soustraction.
2*EC_Sens-1 correspond donc à: deux fois EC_Sens moins un
cela donne +1 pour un crédit, -1 pour un débit
en faisant (2*EC_Sens-1)*EC_Montant, on multiplie le résultat précédent (+1 ou -1) par EC_Montant: cela donne EC_Montant pour un crédit, et moins EC_Montant pour un débit.
on fait ensuite la somme des produits
0
NanoDev Messages postés 13 Date d'inscription lundi 20 février 2017 Statut Membre Dernière intervention 27 mai 2019
27 févr. 2017 à 14:38
Merci encore, je pense avoir compris ! Il m'aura fallu excel pour m'aider !

=(2*1)-1 donne 1 comme résultat 2 étant le multiplicateur, 1 la valeur de EC_sens
ce qui donne 1

=(2*0)-1 donne -1 comme résultat, 2 étant le multiplicateur, 0 la valeur de Ec_sens
ce qui donne - 1

et 1 * 1000 donne 1000
alors que -1 * 1000 donne -1000

J'avais jamais vu ce genre de fonction dans le SELECT et pourtant j'ai des livres,

Merci beaucoup, c'est très sympa à vous !
0