Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/12/2011, 12h34   #1
Candidat au titre de Membre du Club
 
Homme philippe tchaidjian
salarié
Inscription : mars 2011
Messages : 49
Détails du profil
Informations personnelles :
Nom : Homme philippe tchaidjian
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : salarié
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 49
Points : 13
Points : 13
Par défaut SQL pour access ; du ET 'partiel'

Bonjour à tous

je travaille sur une BdD access 2007

J'ai une table qui reprend les produits commandés par les clients.

Je veux sélectionner les clients qui ont commandé deux produits précis (et seulement ces deux produits, mais pas ceux qui en ont commandé qu'un des deux) parmi tous les produits qui ont pu être commandés par les clients.

Comme je m'y attendais, la requête renvoie un résultat vide, car ts les clients susceptibles d être concernés en ont commandé d'autres.

Voici ma syntaxe.

Code :
1
2
3
4
5
SELECT DISTINCT a.Ncli, a.Nom
 
FROM T_ProduitsCommandes a
 
WHERE a.Npro = 'PA45' AND a.Npro = 'PA60'
Pouvez-vs me dire svp comment la modifier pr que le résultat soit opérationnel

Merci d'avance
pppa1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 12h48   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Votre requete essaie de renvoyer les lignes qui ont à la fois a.Npro = 'PA45' AND a.Npro = 'PA60'. Ceci est biensur impossible.

Pour ce genre de cas une requête générique à adapter :
Code :
1
2
3
4
5
6
 
SELECT cli_id
FROM ma_table
WHERE ma_cond IN ('XXX', 'YYYY')
GROUP BY cli_id
HAVING count(DISTINCT (ma_cond)) = 2
Le having count devra être de la même valeur que du nombre de condition recherchez.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 15h29   #3
Candidat au titre de Membre du Club
 
Homme philippe tchaidjian
salarié
Inscription : mars 2011
Messages : 49
Détails du profil
Informations personnelles :
Nom : Homme philippe tchaidjian
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : salarié
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 49
Points : 13
Points : 13
Merci Punkoff

votre requête fonctionne, il m'a juste fallu enlever le DISTINCT de la dernière ligne.

Maintenant l'exercice se complique.

Il y a un client qui a commandé les deux articles, mais un des deux articles a été commandé sur deux commandes différentes.

Or la requête ne compte que ceux qui ont commandé les deux articles sur deux, et seulement deux, commandes distinctes.

Y a-t-il un moyen d'aménager la requête, pour que tous les clients ayant commandé les 2 articles, quel que soit le nombre de commandes, soient sélectionnés ?

de mon côté je regarde si je peux repenser la structure de la table.

Merci de me dire
pppa1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 15h38   #4
Candidat au titre de Membre du Club
 
Homme philippe tchaidjian
salarié
Inscription : mars 2011
Messages : 49
Détails du profil
Informations personnelles :
Nom : Homme philippe tchaidjian
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : salarié
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 49
Points : 13
Points : 13
J'ai trouvé une solution à ce problème : il suffit de ne pas reprendre le champ N° de commande ds la table source.

L'exercice a une suite. Au besoin je me permettrais de revenir.

merci
pppa1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 16h07   #5
Candidat au titre de Membre du Club
 
Homme philippe tchaidjian
salarié
Inscription : mars 2011
Messages : 49
Détails du profil
Informations personnelles :
Nom : Homme philippe tchaidjian
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : salarié
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 49
Points : 13
Points : 13
C'est bon, j'ai terminé ; encore merci
pppa1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 11h05   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Citation:
Envoyé par pppa1 Voir le message
Merci Punkoff

votre requête fonctionne, il m'a juste fallu enlever le DISTINCT de la dernière ligne.
Bonjour,

Non il ne faut pas enlever le distinct.

Pour reprendre votre cas :
Code :
1
2
3
4
5
 
numCli    Npro 
------------------
1           PA45
1           PA45
Sans le distinct la requête vous renverra ce client alors qu'il n'y a pas lieu d'être
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 11h54   #7
Candidat au titre de Membre du Club
 
Homme philippe tchaidjian
salarié
Inscription : mars 2011
Messages : 49
Détails du profil
Informations personnelles :
Nom : Homme philippe tchaidjian
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : salarié
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 49
Points : 13
Points : 13
bonjour

SQL pour Access ne semble pas pouvoir traiter ce script.

Ci-dessous ma requête complète :

Code :
1
2
3
4
5
SELECT DISTINCT a.Ncli, a.Nom, localite
FROM T_ProduitsCommandes AS a
WHERE a.Npro IN ('PA45','PA60')
GROUP BY a.Ncli, a.Nom, localite
HAVING COUNT(DISTINCT (a.Npro))=2  AND Sum(MtCom) > 5000;
si j'exécute ce script, Access me renvoie "fonction 'DISTINCT' non définie dans l'expression".

Le script ainsi modifié :

Code :
1
2
3
4
5
SELECT DISTINCT a.Ncli, a.Nom, localite
FROM T_ProduitsCommandes AS a
WHERE a.Npro IN ('PA45','PA60')
GROUP BY a.Ncli, a.Nom, localite
HAVING COUNT(a.Npro)=2  AND Sum(MtCom) > 5000;
,

donc en enlevant le DISTINCT non reconnu,

me donne le résultat attendu, testé sur plusieurs cas en faisant varier les paramètres.

Je reste à l'écoute de vos suggestions et commentaires

bien cordialement
pppa1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 11h58   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Ah, limitation d'access ...

Disons que si la requête marche c'est parce que dans votre table T_ProduitsCommandes vous n'avez pas plusieurs fois le même couple {Ncli, Npro}

Sinon ça ne marcherait pas
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 12h11   #9
Candidat au titre de Membre du Club
 
Homme philippe tchaidjian
salarié
Inscription : mars 2011
Messages : 49
Détails du profil
Informations personnelles :
Nom : Homme philippe tchaidjian
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : salarié
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 49
Points : 13
Points : 13
Effectivement, j'ai été obligé de passer par une étape intermédiaire

Celle-ci
Code :
1
2
3
4
SELECT DISTINCT a.Ncli, nom, localite, d.Npro, libelle, sum(Qcom) AS QteCmde, Sum(Qcom*Prix) AS MtCom
FROM T_Client AS a, T_Commande AS b, T_Produit AS c, T_detail AS d
WHERE a.ncli = b.Ncli AND b.Ncom = d.Ncom AND d.Npro = c.Npro
GROUP BY a.Ncli, nom, localite, d.Npro, libelle;
que j'importe ensuite sous forme de table sur laquelle je fais les traitements finaux.

Dès que ça se complexifie, Access n'est pas toujours idéal, mais je dois faire avec..
pppa1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h59.


 
 
 
 
Partenaires

Hébergement Web