Problème dans une requête.

Fermé
Kalineor Messages postés 9 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 11 janvier 2016 - 26 juin 2014 à 09:00
 Tessel75 - 26 juin 2014 à 11:53
Bonjour à tous,

Je suis débutant sur Access 2013 et je rencontre un petit problème dans la "conception" d'une requête.

Je vais essayer de faire simple :
Je dispose d'une table qui est constituée de ma base de données Clients.
A coter de celle-ci, j'ai à ma disposition des tables de résultats : une pour chaque mois.
L'objet de ma requête serait d'obtenir pour un ou plusieurs clients, mes ventes pour une ou plusieurs catégories de produits pour plusieurs mois.

J'ai relié la table "Base de Données Clients" à chacun des tables "Mensuelles" via le champ "N° de client", ma clef primaire.

Lorsque dans ma requête je désire isoler certains clients grâce à l'opérateur "Et" ( Par exemple : "N°3" ET "N°9" ET "N°458" sur la même ligne critère ) tout se passe bien. TANT QUE JE NE LUI DEMANDE QU'UNE SEULE CATÉGORIE DE PRODUITS.
Dès que je requiert les résultats pour plusieurs catégories via l'opérateur "OU" (Exemple pour le champ client "N°3" ET "N°8" ET "N°745", et pour le champ catégorie "cat 0845" ou "cat 0569") c'est là que le problème apparaît.
La requête m'affiche alors beaucoup plus d'enregistrements qu'elle ne devrait. J'ai l'impression qu'elle me donne toutes les combinaisons possibles entre les résultats, ce qui n'a aucun sens en terme de reporting xD

Quelques précisions :

J'ai tenté différentes approches : Comme Détailler les critères sur plusieurs lignes, utiliser les regroupements... Rien n'y fait.


J'espère avoir pu rester clair... Si quelqu'un connait la solution, il me serait d'un grande aide !

Bonne journée !



7 réponses

Utilisateur anonyme
26 juin 2014 à 09:08
Bonjour

J'ai tenté différentes approches
Si tu nous en montrais une, histoire que nous comprenions mieux ce que tu as réellement essayé de faire ?
0
Kalineor Messages postés 9 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 11 janvier 2016
26 juin 2014 à 09:55
Tu as raison, des images seront - je l'espère - plus parlantes :)

Pour ces deux premiers liens, tout va "bien". Ma requête semble fonctionner puisque j'obtiens ce que je veux et les chiffres sont corrects.

http://imageshack.com/a/img850/6453/ij7k.png

http://imageshack.com/a/img822/9794/tbsp.png

Par contre, des que j'essaye d'obtenir le résultat sur plusieurs familles ("0150" OU "0480") , elle m'affiche beaucoup trop d'enregistrements... Je devrais en avoir 6 (2 pour chaque clients)

http://imageshack.com/a/img829/6839/1g0u.png

http://imageshack.com/a/img849/6213/bret.png
0
Utilisateur anonyme
26 juin 2014 à 10:26
Pourrais-tu donner la requête en SQL ? Parce que les petits dessins supposés être plus parlants ne me parlent pas.
0
Kalineor Messages postés 9 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 11 janvier 2016
26 juin 2014 à 10:28
La requête quand elle marche bien :

SELECT [Base de données clients].CLIENT, [16700 Février].FAMILLE, [16700 Mai].[QTE MOIS], [16700 Mai].[VALEUR MOIS HT], [16700 Avril].[QTE MOIS], [16700 Avril].[VALEUR MOIS HT], [16700 Mars].[QTE MOIS], [16700 Mars].[VALEUR MOIS HT], [16700 Février].[QTE MOIS], [16700 Février].[VAL PRIX TARIF]
FROM ((([Base de données clients] INNER JOIN [16700 Mars] ON [Base de données clients].CLIENT = [16700 Mars].Client) INNER JOIN [16700 Février] ON [Base de données clients].CLIENT = [16700 Février].Client) INNER JOIN [16700 Mai] ON [Base de données clients].CLIENT = [16700 Mai].Client) INNER JOIN [16700 Avril] ON [Base de données clients].CLIENT = [16700 Avril].Client
WHERE ((([Base de données clients].CLIENT)="1905" Or ([Base de données clients].CLIENT)="1630" Or ([Base de données clients].CLIENT)="1911") AND (([16700 Février].FAMILLE)="0150") AND (([16700 Avril].FAMILLE)="0150") AND (([16700 Mars].FAMILLE)="0150") AND (([16700 Mai].FAMILLE)="0150"));




La requête quand elle marche pas bien ^^ :

SELECT [Base de données clients].CLIENT, [16700 Février].FAMILLE, [16700 Mai].[QTE MOIS], [16700 Mai].[VALEUR MOIS HT], [16700 Avril].[QTE MOIS], [16700 Avril].[VALEUR MOIS HT], [16700 Mars].[QTE MOIS], [16700 Mars].[VALEUR MOIS HT], [16700 Février].[QTE MOIS], [16700 Février].[VAL PRIX TARIF]
FROM ((([Base de données clients] INNER JOIN [16700 Mars] ON [Base de données clients].CLIENT = [16700 Mars].Client) INNER JOIN [16700 Février] ON [Base de données clients].CLIENT = [16700 Février].Client) INNER JOIN [16700 Mai] ON [Base de données clients].CLIENT = [16700 Mai].Client) INNER JOIN [16700 Avril] ON [Base de données clients].CLIENT = [16700 Avril].Client
WHERE ((([Base de données clients].CLIENT)="1905" Or ([Base de données clients].CLIENT)="1630" Or ([Base de données clients].CLIENT)="1911") AND (([16700 Février].FAMILLE)="0150" Or ([16700 Février].FAMILLE)="0480") AND (([16700 Avril].FAMILLE)="0150" Or ([16700 Avril].FAMILLE)="0480") AND (([16700 Mars].FAMILLE)="0150" Or ([16700 Mars].FAMILLE)="0480") AND (([16700 Mai].FAMILLE)="0150" Or ([16700 Mai].FAMILLE)="0480"));
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai mis le temps, mais je comprends pourquoi tu as ça.
En admettant que chaque client a bien 2 FAMILLE qui lui correspondent chaque mois, et en éliminant les lignes qui ne respectent pas le WHERE, chaque INNER JOIN te double le nombre de lignes puisqu'il te crée, à partir de la ligne de départ, une avec FAMILLE="0150" et une avec FAMILLE="0480".
4 inner join -> 16 lignes par client.
Si tu fais un OR entre trois conditions sur FAMILLE et que tu remplis tous les cas pour tous les mois, ça t'en fera 81...

Je n'ai pas encore réfléchi a une ré-écriture de la requête, mais il est clair que tu n'aurais pas eu ce problème si tes données avaient été organisées différemment et, selon moi, plus logiquement : ajouter une nouvelle table par mois signifie que tu interviens sur la structure de la table, que tu modifies les requêtes... une horreur.
Par contre, si tu ajoutes dans ta table 16700février (qui n'a plus de raison de s'appeler février) un champ "mois", et que tu vires les autres tables 16700xxx, tu n'as plus de problème de inner join en cascade. Quand tu veux des infos sur un mois spécifique, tu as juste à préciser un "mois=qqchose"
0
Kalineor Messages postés 9 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 11 janvier 2016
26 juin 2014 à 11:00
Merci pour ces explications ! Même si je ne comprend pas encore très bien l'écriture SQL, là je vois d'où vient le problème :)

Ta solution marche, je n'en doute pas, malheureusement je ne peux pas l'appliquer car ce n'est pas moi qui "conçoit" les tables...Elles sont extraites (mensuellement...) et j'ai pour consigne de ne pas y toucher : /

Encore merci de m'avoir accordé de ton temps !
0
Utilisateur anonyme
26 juin 2014 à 11:09
j'ai pour consigne de ne pas y toucher
Que j'ai horreur de ce genre de réponse ! Mais je le comprends, il m'arrive moi aussi d'être victime de contraintes dont la raison m'échappe.
Bonne continuation.
0
Bonjour,
Suis d'accord à 200% avec vous LePère.
Les BDD ont justement été conçues pour compiler des grosses quantités de données: avoir un champ Mois est la bonne réponse, même la seule; sinon c'est comme si l'INSEE constituait une nouvelle table pour répertorier les personnes nées chaque mois, ou un magasin qui aurait des tables différentes pour les achats et ventes selon chaque mois, ... débile.
" il m'arrive moi aussi d'être victime de contraintes dont la raison m'échappe. ": Ben! on peut imaginer qu'il y a un crétin qui a toujours fait comme ça, et qui voit pas que ça pourrait changer.

Enfin notre ami devrait nous envoyer un extrait de sa base (en anonymisant les noms), ce serait plus facile que des captures d'écran
0