Somme des prix HT * Quantité, Erreur de calcul

[Résolu/Fermé]
Signaler
-
 Simslim -
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

Messages postés
17098
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2021
906
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?

Bonjour,

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

A+
Messages postés
17098
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2021
906
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 
Utilisateur anonyme
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+
Messages postés
17098
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2021
906 > Utilisateur anonyme
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.
Utilisateur anonyme >
Messages postés
17098
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2021

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+
Messages postés
17098
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2021
906 > Utilisateur anonyme
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
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!