Developpez.com

Plus de 14 000 cours et tutoriels en informatique professionnelle à consulter, à télécharger ou à visionner en vidéo.

FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireRequêtesConception

Il y a une grosse différence entre DISTINCTROW et DISTINCT.
- On utilise DISTINCTROW lorsque l'on choisit de travailler sur des lignes qui à l'origine sont sans doublon.
si ma table contient : Nom ------- Prénom
Dupont ---- Jean
Dupont ---- Pierre
Dupond --- Jean
Dupont ---- Jean

un

 
Sélectionnez
Select DistinctRow NOM From MATABLE

me renverra : Dupont Dupont Dupond
Car j'ai 2 Dupont Jean(1), 1 Dupont Pierre(2) et 1 Dupond Jean(3)

- Contrairement au DISTINCTROW, le DISTINCT s'intéresse quant à lui au résultat affiché. Il n'affiche que des lignes sans doublon. Ainsi, avec la même table que précédemment, un petit

 
Sélectionnez
Select Distinct NOM From MATABLE

ne renverra que : Dupont Dupond

Créé le 3 septembre 2004  par Maxence HUBICHE

Il suffit d'utiliser "DISTINCT" dans la requête source. Exemple :

 
Sélectionnez
Select distinct NOM From TEMPLOYE;

Vous obtiendrez tous les noms des employés. Si plusieurs employés ont le même nom, il n'apparaîtra qu'une fois.

Créé le 29 décembre 2003  par Demco

Maxence HUBICHE vous dévoile tout ce que vous avez besoin de savoir sur les jointures, à quoi elles servent et comment les mettre en place.

Créé le 23 août 2003  par Maxence HUBICHE

Lien : Tutoriel sur les jointures/relations dans MS Access

 
Sélectionnez
Select LECHAMP From TABLE1 Where LECHAMP Not In (Select LECHAMP2 From TABLE2);
Créé le 29 décembre 2003  par Demco

Imaginons qu'un employé a eu plusieurs promotions au cours de sa carrière.
Chaque promotion est stockée avec sa date d'obtention.
On veut avoir le récapitulatif des promotions de chaque employé. On veut aussi connaître le numéro de la promotion (3 si c'est la troisième promotion de l'employé...).

 
Sélectionnez
 Select *, (Select Count(*) From LATABLE T2 Where T2.ID=T1.ID And T2.DATE<=T1.DATE) As NUMORDRE 
From LATABLE T1;
Créé le 29 décembre 2003  par Maxence HUBICHE

Pour le premier :

 
Sélectionnez
Select First(MONCHAMP) From LATABLE;


Pour le dernier :

 
Sélectionnez
Select Last(MONCHAMP) From LATABLE;
Créé le 25 octobre 2004  par Demco

Il faut utiliser count() sur le(s) champ(s) concerné(s).
Pour en savoir plus --> http://sqlpro.developpez.com/SQL_AZ_2.html#SELECT_stat

Exemple :

 
Sélectionnez
Select count(CHAMP1) From LATABLE Where CHAMP2 = 3 And CHAMP3 LIKE "*blabla*"
Mis à jour le 25 octobre 2004  par Team Access

Lien : Comment compter le nombre d'enregistrements d'une table ou d'une requête ?

Utile par exemple pour le code postal (français), pour grouper par département :

 
Sélectionnez
Select Distinct Left(LECHAMP,2) As CODE_POSTAL
From PERSONNE;
Créé le 3 septembre 2004  par Lucifer

Deux solutions :

 
Sélectionnez
Select TOP 5 PERCENT MATABLE.MONCHAMP1, MATABLE.MONCHAMP2
From MATABLE; 

Pour récupérer 5 lignes sur 100 (5 %)

 
Sélectionnez
Select TOP 5 MATABLE.MONCHAMP1, MATABLE.MONCHAMP2
From MATABLE; 

Pour récupérer 5 lignes.

Créé le 1er avril 2004  par Gaël Donat

Ceci peut se produire lorsque la sous-requête renvoie des valeurs Nulles.
La solution est donc de filtrer ces valeurs directement dans la sous-requête en spécifiant par exemple une clause Where.

Par exemple :

 
Sélectionnez
Select MATABLE.CHAMP1 From MATABLE Where MATABLE.CHAMP1 Not In (Select MONCHAMP Where ((tbl.LaDate) Is Not Null))
 
Sélectionnez
Select MATABLE.CHAMP1 From MATABLE Where MATABLE.CHAMP1 Not In (Select MONCHAMP Where Not IsNull(MONCHAMP))
Créé le 1er janvier 2005  par Tofalu


Comment faire pour qu'une requête ne renvoie que les enregistrements 50 à 100 par exemple ?
Ceci est facilement possible sous MySQL en passant par un "LIMIT 50,50", mais n'existe pas encore sous Access.


Il est cependant possible d'arriver à nos fins grâce à diverses astuces :


En créant deux requêtes. Une qui sélectionne les 100 enregistrements, puis une seconde qui ne sélectionne que les 50 derniers enregistrements de la requête précédente. Ainsi nous aurons bien les enregistrements 50 à 100.
Créons donc la première requête que nous nommerons "Req1"

 
Sélectionnez

Select TOP 100 ID, ladate
FROM LaTable
Order By ladate Asc;


Ensuite, il ne reste qu'à sélectionner les 50 derniers enregistrements de la requête ci-dessus :

 
Sélectionnez

Select TOP 50 ID, ladate
FROM Req1
OrderBy ladate Desc;


En passant par DAO et un tableau. Vous trouverez les détails de cette fonctionnalité DAO dans le tutoriel de Tofalu dont le lien est ci-dessous.
Une fois les données d'un Recordset dans un tableau, vous pouvez atteindre très facilement les enregistrements désirés.

Créé le 20 novembre 2005  par Maxence HUBICHE, Tofalu

Lien : Définition et manipulation de données avec DAO par Tofalu

 
Sélectionnez

Select *
From Table1 AS T1
Where Not Exists (Select null
        From Table2 AS T2
        Where T1.[champT1]=T2.[champT2])

Cette requête sélectionnera tous les enregistrements de Table1 dont le champ "champT1" possède une valeur ne se trouvant pas dans le champ "champT2" de la seconde table.

Mis à jour le 14 octobre 2007  par MashiMaro

Une requête UNION élimine les doublons dans les lignes qu'elle renvoie. Pour forcer la clause UNION à conserver les doublons dans les résultats retournés, utilisez UNION ALL en mode SQL.

 
Sélectionnez

				SELECT * FROM TABLE1
				UNION ALL
				SELECT * FROM TABLE2
				
Créé le 29 novembre 2006  par vmolines


La commande SQL TRUNCATE n'est pas reconnue par Access. Il faut donc utiliser une requête SQL Direct pour passer l'ordre SQL directement au moteur de base de données (MySQL) par exemple.

Vous pouvez ainsi exécuter n'importe quelle requête compatible avec le serveur qui était incompatible avec le SQL de Jet.


1. Créez la liaison ODBC avec le gestionnaire de liaisons (Démarrer -> paramètres -> source de données ODBC). Dans cet exemple, la base s'appelle "base_MySQL" sur le serveur "nom_du_serveur".


2. Créez la requête avec Créer une requête en mode création. Fermez la liste des tables et requêtes. Clic droit sur la table -> Spécifique SQL -> SQL Direct.


3. Écrivez la requête

 
Sélectionnez

TRUNCATE Matable;


4. Dans la barre de titre de la requête, clic droit -> propriétés ->Chaîne connexion ODBC : Indiquez le chemin de connexion sous la forme

 
Sélectionnez

ODBC;DATABASE=base_MySQL;DSN=base_MySQL;OPTION=0;PORT=0;SERVER=nom_du_serveur;


5. Exécutez la requête. Un message d'avertissement apparaît car la requête ne renvoie rien (forcément, c'est une requête de destruction de données !).


Pour éviter ce message, vous pouvez modifier la propriété Renvoie enr. de la requête SQL Direct à Non.

Créé le 29 novembre 2006  par =JBO=, guydav

Nous allons dans cette Q/R expliquer comment catégoriser des clients pour leur attribuer une réduction qui sera déduite sur la facture.

Pour cela nous allons développer trois méthodes :

Méthode statique

Les taux de remises sont écrits directement dans le code.

 
Sélectionnez
= montant - (montant * iif(categorie like "A";0.1;iif(categorie like "B";0.2;0.3)))

montant est le champ contenant la somme.
catégorie est le champ contenant la catégorie client.
Deux inconvénients :
- l'imbrication des iif qui peut prendre des proportions avec la quantité de catégories ;
- l'obligation d'éditer le code lorsque l'on ajoute ou change une catégorie.
Notez qu'avec une catégorie numérique 1 au lieu de A, 2 au lieu de B... on peut utiliser Choose() qui se réduit à une fonction au lieu d'une par catégorie.



Méthode paramétrée

Cette méthode a deux avantages :
- l'ajout, la modification, la suppression de catégorie peuvent se faire par l'utilisateur, pas de code à modifier ;
- pas d'imbrication de iif().
Inconvénient :
on doit créer une table supplémentaire pour gérer les remises.
Table : tbl_param
Champ 1 : param (texte 1) contient A, B, C
Champ 2 : valeur (double) contient la remise sous forme 0.1, 0.2...

 
Sélectionnez
=Montant - (Montant * dlookup("Valeur";"tbl_param";"Param like " & Categorie))



3e méthode

De loin la plus simple.
Catégorie ne contient pas A B ou C mais directement 1, 2, 3 (la valeur de la remise * par 10)

 
Sélectionnez
=Montant - (Montant * Categorie/10)
Créé le 14 octobre 2007  par loufab

Voici un exemple en utilisant la fonction de Domaine DCount

Soit une table (tbl_DetailFacture) avec trois champs
- strArticle
- lngQte
- curPrixUnit

Le code classe par ordre croissant les prix unitaires

 
Sélectionnez
SELECT strArticle,lngQte,curPrixUnit, DCount("[strArticle]","[tbl_DetailFacture]","[CurPrixUnit]<=" & [CurPrixUnit]) AS Cumul
FROM tbl_DetailFacture
ORDER BY curPrixUnit;

Ceci donne dans le champ cumul une numérotation des enregistrements.
Pour que cela fonctionne correctement, il faut que la clause de la fonction de Domaine DCount soit sur le champ que l'on veut trier.

Créé le 14 octobre 2007  par Philippe JOCHMANS

Lien : Classer les résultats d'une requête
Lien : Classer des données par plage

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.