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
Tessel75 - 26 juin 2014 à 11:53
A voir également:
- Problème dans une requête.
- Requête sql pix - Forum Python
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de tennis mais pas de tennis de table ✓ - Forum Java
- Erreur de requete facebook - Forum Facebook
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de pomme mais pas de pomme de terre ? - Forum Thunderbird
- Nos systèmes ont détecté un trafic exceptionnel sur votre réseau informatique. veuillez renvoyer votre requête ultérieurement. ✓ - Forum Virus
7 réponses
Utilisateur anonyme
26 juin 2014 à 09:08
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 ?
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 ?
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
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
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
Utilisateur anonyme
26 juin 2014 à 10:26
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.
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
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"));
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"));
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
Modifié par le père. le 26/06/2014 à 10:55
Modifié par le père. le 26/06/2014 à 10:55
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"
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"
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
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 !
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 !
Utilisateur anonyme
26 juin 2014 à 11:09
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.
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.
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
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