Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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 19/08/2011, 11h36   #1
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Par défaut Eliminer les doublons sur 2 champs

Bonjour,

J'ai une requête qui me donne un résultat avec des doublons.
Je vuex donc faire une autre requête dessus pour lister tous mes champs sauf ceux qui ont 2 champs sont en doublons
Exemple (raccourci) de mon résultat :
Citation:
PRIX X100-01055-BF8103-Présent BC-EZ-....
PRIX X200-03051-BF8103-Présent BC-EZ-...
PRIX X100-01055-BF8103-Pour la MAJ-EZ-...
PRIX X100-01055-BS8122-Pour la MAJ-EZ-...
JE voudrais éliminer mes doublons codeclient(01055) et article(BF8103) pour obtenir ceci (je dois garder 1 seule ligne qd il y a doublon):
Citation:
PRIX X100-01055-BF8103-Présent BC-EZ-....
PRIX X200-03051-BF8103-Présent BC-EZ-...
PRIX X100-01055-BS8122-Pour la MAJ-EZ-...
En cherchant sur le forum, j'ai lu qu'on pouvait mettre DISTINCT sous SQL.
J'ai donc essayé ce qui suit. Cela marche si je mets 2 ou 3 champs mais si dans ma requête, je mets tous mes champs, cela ne marche plus !!


Code :
1
2
3
4
SELECT DISTINCT ReqListingMAJTarifManuel.INFOCLUB, ReqListingMAJTarifManuel.COD_CLT, ReqListingMAJTarifManuel.REFERENCE, ReqListingMAJTarifManuel.COD_ART, ReqListingMAJTarifManuel.INFO, ReqListingMAJTarifManuel.GROUPEART, ReqListingMAJTarifManuel.PU_BRUT, ReqListingMAJTarifManuel.COD, ReqListingMAJTarifManuel.MAJMANUELLE, ReqListingMAJTarifManuel.NUM_ORD, ReqListingMAJTarifManuel.REF_CMD, ReqListingMAJTarifManuel.COD_REP, ReqListingMAJTarifManuel.BC_SAISON,
 ReqListingMAJTarifManuel.[PRIX X1], ReqListingMAJTarifManuel.[PRIX X2], ReqListingMAJTarifManuel.[PRIX X3], ReqListingMAJTarifManuel.[PRIX X4], ReqListingMAJTarifManuel.[PRIX X6], ReqListingMAJTarifManuel.[PRIX X8], ReqListingMAJTarifManuel.[PRIX X12], ReqListingMAJTarifManuel.[PRIX X15], ReqListingMAJTarifManuel.[PRIX X30], ReqListingMAJTarifManuel.[PRIX X40], ReqListingMAJTarifManuel.[PRIX X60], ReqListingMAJTarifManuel.[PRIX X100], ReqListingMAJTarifManuel.[PRIX X250], ReqListingMAJTarifManuel.PXMAJ, ReqListingMAJTarifManuel.Prix
 
FROM ReqListingMAJTarifManuel;

Sauriez-vous comment je peux y arriver ?
Merci pour votre aide
Thibault
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h25   #2
Membre du Club
 
Homme
Statisticien
Inscription : février 2009
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Statisticien
Secteur : Finance

Informations forums :
Inscription : février 2009
Messages : 43
Points : 56
Points : 56
Dans Access tu as une fonction pour récupérer les doublons.

Dans le menu requêtes et Nouveau, tu as un assistant pour récupérer les doublons.

Cela peut il t'aider.
Cdt.
dev_ggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h58   #3
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci pour ta proposition.

J'ai essayé entre temps : cela m'indique les doublons dans une requête N°2

Mais comment ensuite relier les 2 requêtes pour obtenir une liste sans doublons ?

Je continue à fouiller dans les archives du forum. Mais je ne trouve rien qui fonctionne avec mon cas.

Je viens de lire un post sur l'emploi de UNION mais ce test ne marche pas non plus :
Code :
1
2
3
4
5
SELECT ReqListingMAJTarifManuel.REFERENCE, ReqListingMAJTarifManuel.COD_ART, ReqListingMAJTarifManuel.INFO, ReqListingMAJTarifManuel.GROUPEART
FROM ReqListingMAJTarifManuel
UNION
SELECT [ReqListingMAJTarifManuel Recherche doublons].REFERENCE, [ReqListingMAJTarifManuel Recherche doublons].COD_ART, [ReqListingMAJTarifManuel Recherche doublons].INFO, [ReqListingMAJTarifManuel Recherche doublons].GROUPEART
FROM [ReqListingMAJTarifManuel Recherche doublons];
Moi qui croyait que cela allait me prendre 10 min pour avoir une requête sans doublons !!! Je me prends bien la tête depuis ce matin !
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h46   #4
Membre du Club
 
Homme
Statisticien
Inscription : février 2009
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Statisticien
Secteur : Finance

Informations forums :
Inscription : février 2009
Messages : 43
Points : 56
Points : 56
tu peux te créer une requête imbriquer.

Code :
Selec clef, * from TaTable where clef not in (requête que tu viens de créer resultat des doublons)
Avec comme résultat de de la requête des doublons uniquement le champ de ta clef primaire de ta première table.

Ceci peut t'aide ?
Cdt.
dev_ggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h29   #5
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Mon problème est que je ne viens pas d'une table mais d'une requête. Mes tables sont sans doublons. C'est la requête qui me génère les doublons.

Ma requête d'origine est un poil complexe :
je la mets pour info au cas où :
Code :
1
2
3
4
5
6
 
SELECT [ACCESS_ENTETES_VTES]![CODTARIFNOUVEAU] AS COD, ACCESS_LIGNES_VTES.COD_CLT, T_ListeArt_TarifComplet.REFERENCE, ACCESS_LIGNES_VTES.COD_ART, IIf([REFERENCE]=[ACCESS_LIGNES_VTES].[COD_ART],"Présent dans le BC","Pour MAJ tarif du Groupe") AS INFO, ACCESS_LIGNES_VTES.GROUPEART, ACCESS_LIGNES_VTES.PU_BRUT, ACCESS_LIGNES_VTES.INFOCLUB, ACCESS_LIGNES_VTES.MAJMANUELLE, ACCESS_ENTETES_VTES.NUM_ORD, ACCESS_ENTETES_VTES.REF_CMD, ACCESS_ENTETES_VTES.COD_REP, ACCESS_ENTETES_VTES.BC_SAISON, T_ListeArt_TarifComplet.[PRIX X1], T_ListeArt_TarifComplet.[PRIX X2], T_ListeArt_TarifComplet.[PRIX X3], T_ListeArt_TarifComplet.[PRIX X4], T_ListeArt_TarifComplet.[PRIX X6], T_ListeArt_TarifComplet.[PRIX X8], T_ListeArt_TarifComplet.[PRIX X12], T_ListeArt_TarifComplet.[PRIX X15], T_ListeArt_TarifComplet.[PRIX X30], T_ListeArt_TarifComplet.[PRIX X40], T_ListeArt_TarifComplet.[PRIX X60], T_ListeArt_TarifComplet.[PRIX X100], T_ListeArt_TarifComplet.[PRIX X250], PRIXMAJ([INFOCLUB],[PRIX X1],[PRIX X2],[PRIX X3],[PRIX X4],[PRIX X6],[PRIX X8],[PRIX X12],[PRIX X15],[PRIX X30],[PRIX X40],[PRIX X60],[PRIX X100],[PRIX X250]) AS PXMAJ, Switch(ACCESS_LIGNES_VTES.INFOCLUB="Prix X1",[Prix X1],ACCESS_LIGNES_VTES.INFOCLUB="Prix X2",[Prix X2],ACCESS_LIGNES_VTES.INFOCLUB="Prix X3",[Prix X3],ACCESS_LIGNES_VTES.INFOCLUB="Prix X4",[Prix X4],ACCESS_LIGNES_VTES.INFOCLUB="Prix X6",[Prix X6],ACCESS_LIGNES_VTES.INFOCLUB="Prix X8",[Prix X8],ACCESS_LIGNES_VTES.INFOCLUB="Prix X12",[Prix X12],ACCESS_LIGNES_VTES.INFOCLUB="Prix X15",[Prix X15],ACCESS_LIGNES_VTES.INFOCLUB="Prix X30",[Prix X30],ACCESS_LIGNES_VTES.INFOCLUB="Prix X40",[Prix X40],ACCESS_LIGNES_VTES.INFOCLUB="Prix X60",[Prix X60],ACCESS_LIGNES_VTES.INFOCLUB="Prix X100",[Prix X100],ACCESS_LIGNES_VTES.INFOCLUB="Prix X250",[Prix X250]) AS Prix, [ACCESS_LIGNES_VTES].[COD_CLT] & [REFERENCE] AS antidoublon
FROM ACCESS_ENTETES_VTES INNER JOIN ((ACCESS_LIGNES_VTES INNER JOIN dbo_CLIENTS ON ACCESS_LIGNES_VTES.COD_CLT = dbo_CLIENTS.COD_CLT) LEFT JOIN T_ListeArt_TarifComplet ON ACCESS_LIGNES_VTES.GROUPEART = T_ListeArt_TarifComplet.GRP) ON ACCESS_ENTETES_VTES.NUM_ORD = ACCESS_LIGNES_VTES.NUM_ORD
GROUP BY [ACCESS_ENTETES_VTES]![CODTARIFNOUVEAU], ACCESS_LIGNES_VTES.COD_CLT, T_ListeArt_TarifComplet.REFERENCE, ACCESS_LIGNES_VTES.COD_ART, IIf([REFERENCE]=[ACCESS_LIGNES_VTES].[COD_ART],"Présent dans le BC","Pour MAJ tarif du Groupe"), ACCESS_LIGNES_VTES.GROUPEART, ACCESS_LIGNES_VTES.PU_BRUT, ACCESS_LIGNES_VTES.INFOCLUB, ACCESS_LIGNES_VTES.MAJMANUELLE, ACCESS_ENTETES_VTES.NUM_ORD, ACCESS_ENTETES_VTES.REF_CMD, ACCESS_ENTETES_VTES.COD_REP, ACCESS_ENTETES_VTES.BC_SAISON, T_ListeArt_TarifComplet.[PRIX X1], T_ListeArt_TarifComplet.[PRIX X2], T_ListeArt_TarifComplet.[PRIX X3], T_ListeArt_TarifComplet.[PRIX X4], T_ListeArt_TarifComplet.[PRIX X6], T_ListeArt_TarifComplet.[PRIX X8], T_ListeArt_TarifComplet.[PRIX X12], T_ListeArt_TarifComplet.[PRIX X15], T_ListeArt_TarifComplet.[PRIX X30], T_ListeArt_TarifComplet.[PRIX X40], T_ListeArt_TarifComplet.[PRIX X60], T_ListeArt_TarifComplet.[PRIX X100], T_ListeArt_TarifComplet.[PRIX X250], PRIXMAJ([INFOCLUB],[PRIX X1],[PRIX X2],[PRIX X3],[PRIX X4],[PRIX X6],[PRIX X8],[PRIX X12],[PRIX X15],[PRIX X30],[PRIX X40],[PRIX X60],[PRIX X100],[PRIX X250]), [ACCESS_LIGNES_VTES].[COD_CLT] & [REFERENCE]
HAVING (((ACCESS_LIGNES_VTES.GROUPEART)<>"AUCUN_GROUPE") AND ((ACCESS_LIGNES_VTES.INFOCLUB) Like "PRIX *") AND ((ACCESS_LIGNES_VTES.MAJMANUELLE)="1") AND ((ACCESS_ENTETES_VTES.BC_SAISON)=0))
ORDER BY IIf([REFERENCE]=[ACCESS_LIGNES_VTES].[COD_ART],"Présent dans le BC","Pour MAJ tarif du Groupe") DESC;
Elle me donne un résultat de ce type extrait de qq colonnes)


Les lignes en rouge sont mes doublons. (COD_CLT et REFERENCE)

Merci pour votre aide
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 23h29   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir,

Citation:
Envoyé par tibofo
JE voudrais éliminer mes doublons codeclient(01055) et article(BF8103) pour obtenir ceci (je dois garder 1 seule ligne qd il y a doublon):
Il ne peut en rester qu'une, mais laquelle des deux ?
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/08/2011, 09h09   #7
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Pour l'instant, je cherche la simplicité (Aie ! cela me fait mal de dire cela après plus d'une journée à me triturer pour essayer de trouver une solution !! ) :

garder une des lignes en doublons mais n'importe laquelle des 2, ou 3 ou 4 ou x


Après si, je progresse, peut-être que j'envisagerais de garder la ligne en doublons qui contient dans le champ [INFO]="Présent dans le BC" ou
si les doublons ne concernent que des lignes où [INFO]="Pour MAJ Tarif du Groupe" , je conserverais n'importe laquelle des 2,ou 3 ou 4 ou x.




Edit : Si vous avez une solution SQL, j'en serais ravi (car + simple). Ds mon sommeil agité, j'ai commencé à envisager un autre axe de solution : via VBA :
lire ma requête, repérer et ignorer les doublons selon mes conditions puis envoyer une table temporaire les enregistrements sans doublons. (mais il me reste encore une inconnu sur la gestion de ce nettoyage par rapport au vba) (cela me fera l'objet d'un post différent ds VBA)
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 21h31   #8
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
Bonsoir,

Citation:
Après si, je progresse, peut-être que j'envisagerais de garder la ligne en doublons qui contient dans le champ [INFO]="Présent dans le BC" ou si les doublons ne concernent que des lignes où [INFO]="Pour MAJ Tarif du Groupe" , je conserverais n'importe laquelle des 2,ou 3 ou 4 ou x.
En espérant (priant) que tu aies un identifiant [id] pour distinguer toutes ces lignes, on peut essayer :
Code sql :
1
2
3
4
5
6
7
8
SELECT T.id FROM Tibofo  T
WHERE T.id IN
(
   SELECT TOP 1 U.id FROM Tibofo U 
   WHERE  U.CODE_CLT=T.CODE_CLT
          AND U.REFERENCE=T.REFERENCE
   ORDER BY U.INFO DESC, U.id
) ;
La requête retourne normalement les [id] à conserver.

Sans [id], ça risque de devenir glauque
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 15h59   #9
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci Fabien.

Cela ne loupe pas, je n'ai pas de champs ID pouvant me servir.
En attendant, j'ai testé ta soluce en mettant mes données dans une table tempo, à laquelle j'ai rajouté un champ ID.

Cela marche parfaitement.

Je vais donc essayer d'utiliser ta solution.
En faisant une 1ère requête de Création de table.
puis ajout dans la table en VBA du champs ID en index numéroauto (je vais voir dans le sous forum vba à ce sujet)
puis utilisation de ta soluce.

Merci
Cela du bien de pouvoir avancer d'une case !!
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 19h00   #10
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonjour,

Citation:
Cela ne loupe pas, je n'ai pas de champ ID pouvant me servir.
Qu'est-ce qui t'empêche d'en ajouter un dans ta table, de manière définitive, ça ne mange pas de pain !
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 19h05   #11
Candidat au titre de Membre du Club
 
Inscription : juillet 2005
Messages : 11
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 11
Points : 14
Points : 14
Par défaut Regroupement

Bonjour,
Je suppose que depuis 1 mois tu as trouvé.
Pour qu'une requête ne te crée pas de doublon, tu peux utiliser les regroupement. Dans la construction de requête, tu utilise le bouton "sigma", et ensuite tu choisis de "regrouper" sur les champs que tu veux en 1 seul exemplaire (article et client), et pour les autres champs tu n'utilise surtout pas de regroupement, mais plutôt "le plus petit", "le plus grand", "le dernier", "le premier". Ainsi pour chaque couple client-article, tu obtiens le dernier de "info".

Autre piège courant quand on débute, la multiplication : tu relies 2 tables, mais sur un champ qui n'est pas unique ni dans une table ni dans l'autre. Par exemple une valeur d'un champ est en 3 exemplaires dans une table, en 2 exemplaires dans l'autre. Tu relies les 2 tables par ce champ, et tu as 6 lignes !
JeanMiG est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h20.


 
 
 
 
Partenaires

Hébergement Web