Somme des prix HT * Quantité, Erreur de calcul

Résolu/Fermé
Simslim - Modifié le 24 mars 2017 à 16:34
 Simslim - 26 mars 2017 à 18:42
Bonjour, novice en SQL, je m'arrache les cheveux sur cette requête qui marche en apparence, mais dont les résultats des calculs sont erronés. La jonction des tables est OK.

SELECT COMMANDEID,SUM (COUTE.PRIXHT*CONTIENT.QTE) AS MHT, SUM ((COUTE.PRIXHT*CONTIENT.QTE)*(1+TAUX)) AS MTTC
FROM TVA, PRODUIT, COUTE, CONTIENT
WHERE TVA.TAUXID=PRODUIT.TAUXID AND PRODUIT.PRODUITID=COUTE.PRODUITID AND PRODUIT.PRODUITID=CONTIENT.PRODUITID
GROUP BY COMMANDEID

Quelqu'un saurait il m'aider à ne pas devenir chauve? D'avance merci!

4 réponses

yg_be Messages postés 20751 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 décembre 2022 1 270
Modifié le 24 mars 2017 à 20:39
bonsoir, pourrais-tu nous en dire plus sur le contenu de tes tables? quelles sont le colonnes et quelles sont les clés uniques?
ainsi que sur le type d'erreur : "les résultats des calculs sont erronés" : nuls, trop petits, trop grands?
0
Utilisateur anonyme
24 mars 2017 à 20:47
Bonjour,

il manque les 'JOIN' dans la requête...

A+
0
yg_be Messages postés 20751 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 décembre 2022 1 270
25 mars 2017 à 08:58
et la réponse à ceci te semble correcte?
SELECT COMMANDEID,PRODUITID, COUTE.PRIXHT*CONTIENT.QTE AS MHT, (COUTE.PRIXHT*CONTIENT.QTE)*(1+TAUX) AS MTTC 
FROM TVA, PRODUIT, COUTE, CONTIENT 
WHERE TVA.TAUXID=PRODUIT.TAUXID AND PRODUIT.PRODUITID=COUTE.PRODUITID AND PRODUIT.PRODUITID=CONTIENT.PRODUITID 
0
Utilisateur anonyme
Modifié le 25 mars 2017 à 20:12
Si ta question m'est destinée, non... :)

Une jointure dans une clause WHERE est juste une hérésie.

Tant que l'on n'a pas le nom des différents champs, impossible d'écrire une quey...

Surtout que je ne vois pas pourquoi une TABLE coute et une table contient...
A+
0
yg_be Messages postés 20751 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 décembre 2022 1 270 > Utilisateur anonyme
25 mars 2017 à 20:55
La question est destinée à Simslim, je pense qu'il est le seul à pouvoir exécuter cette requête et analyser si la réponse lui semble correcte.
Je pense que la table COUTE a les champs PRODUITID et PRIXHT, et donne donc le coût de chaque produit, tandis que la table CONTIENT a les champs COMMANDEID, PRODUITID et QTE, et donne donc le contenu de chaque commande, le nombre de chacun des produits inclus dans chaque commande.
Je respecte ton choix d'adhérer au dogme concernant l'écriture des jointures hors WHERE.
0
Utilisateur anonyme > yg_be Messages postés 20751 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 décembre 2022
Modifié le 26 mars 2017 à 00:29
OK,
mais je ne pige toujours pas l'intérêt d'avoir une table COUTE (drôle de nom) et une table CONTIENT...

Bref, lui seul répondra (s'il le souhaite, et il n'est pas pressé à 1ère vue).

Pour le reste, ce n'est pas un dogme, mais une réalité d'écriture SQL et de performances. Je crois que cela date des années 90, à l'époque où je bossais sur du COBOL sur des sys IBM (40m² de "mini ordinateurs) !!!!!

Le JOIN sert à indiquer les relations, le WHERE les conditions.

Je ne fais plus trop d'Access depuis 2 ans, mais du SQL Server. Et crois moi que niveau perfs, sur une base de 2To (Tera pas Giga), il n'y a pas photo. C'est juste une habitude à prendre.

Après, une base de 2To Access, je n'ai jamais vu ! et heureusement d'ailleurs...

A+
0
yg_be Messages postés 20751 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 décembre 2022 1 270 > Utilisateur anonyme
26 mars 2017 à 11:19
Il me semble en effet plus logique, au lieu des quatre tables TVA, PRODUIT, COUTE et CONTIENT, d'avoir trois tables: TVA, PRODUIT et COMMANDE.
COMMANDE : COMMANDEID, PRODUITID, QTE
PRODUIT: PRODUITID, TAUXID, PRIXHT
TVA : TAUXID, TAUX
La requête serait alors (attention, formulation hérétique!):
SELECT COMMANDEID,SUM (PRIXHT*QTE) AS MHT, SUM ((PRIXHT*QTE)*(1+TAUX)) AS MTTC 
FROM TVA, PRODUIT, COMMANDE 
WHERE TVA.TAUXID=PRODUIT.TAUXID AND PRODUIT.PRODUITID=COMMANDE.PRODUITID
GROUP BY COMMANDEID
0
Bonjour à tous et merci pour votre mobilisation!

En effet, yg_be tu avais bien compris la structure des tables. Je suis désolé de vous avoir fait perdre votre temps, car je viens de trouver la solution, le probleme venait du fait que la table COUTE contenait un champ "catalogue" en plus des champs PRIXHT et PRODUITID. Il fallait que je mette une condition sur le champ "catalogue".

HDU, on m'a appris qu'il était possible de lier les tables de deux façon, j'utilise le where car étant débutant cela me parait plus facile, mais les deux fonctionnent très bien, et je ne vois pas vraiment la différence.

Enfin, cette requête m'a été donné à faire dans le cadre d'un TP de master. C'est pour cela que les noms des tables sont surprenants, et c'est aussi pour ca que ces quatre tables sont présentes au lieu des trois normalement nécessaire: la structure initiale des tables nous a été donnée ainsi. j'ai d'ailleurs une table COMMANDE ou apparaissent directement les montants recherchés, mais la consigne interdisait de passer par ce champ.

Je vous présente un nouvelle fois mes excuses d'avoir fait appel à vos savoirs sans vous avoir donné toutes les cartes en mains, et vous remerci pour votre réactivité!

Résolu, merci, A bientôt!
0