Il peut arriver que vous souhaitiez combiner des enregistrements d’une table ou d’une requête avec des enregistrements d’une ou plusieurs autres tables dans un résultat unique. C’est ce que fait une requête Union dans Access.
Pour comprendre parfaitement les requêtes Union, vous devez d’abord être familiarisé avec la conception de requêtes Sélection de base dans Access. Pour en savoir plus sur la création de requêtes Sélection, reportez-vous à Créer une requête Sélection simple.
Étudier un exemple de requête Union fonctionnel
Si vous n’avez jamais créé de requête Union auparavant, il peut être utile d’étudier d’abord un exemple fonctionnel dans le modèle Northwind Access. Vous pouvez rechercher l’exemple de modèle Les Comptoirs sur la page Prise en main d’Access en sélectionnantNouveaufichier>. Vous pouvez également télécharger une copie directement à partir de l’exemple de modèle Northwind.
Une fois qu’Access a ouvert la base de données Les Comptoirs, ignorez la boîte de dialogue de connexion qui s’affiche en premier, puis développez le volet de navigation. Cliquez sur la partie supérieure du volet de navigation, puis sur Type d’objet pour organiser tous les objets de base de données par type. Ensuite, développez le groupe Requêtes , et vous verrez une requête appelée Transactions de produit.
Les requêtes Union sont faciles à différencier des autres objets de requête, car elles possèdent une icône spéciale dont les deux cercles entrelacés représentent un ensemble unifié à partir de deux ensembles :
Contrairement aux requêtes de sélection et d’action normales, les tables ne sont pas liées dans une requête Union. Vous ne pouvez donc pas utiliser le Concepteur de requêtes graphiques Access pour créer ou modifier des requêtes Union. Si vous ouvrez une requête Union à partir du volet de navigation, Access l’ouvre et affiche les résultats en mode Feuille de données. Sous Affichages sous l’onglet Accueil , notez que le mode Création n’est pas disponible lorsque vous travaillez avec des requêtes Union. Vous pouvez basculer uniquement entre le mode Feuille de données et le mode SQL.
Pour poursuivre votre étude de cet exemple de requête Union, cliquez sur Mode Accueil>Vues>SQL pour afficher la SQL syntaxe qui le définit. Dans cette illustration, nous avons ajouté un espacement supplémentaire dans afin SQL que vous puissiez facilement voir les différentes parties qui composent une requête Union.
Examinons en détail la SQL syntaxe de cette requête d’union de la base de données Northwind :
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Les première et troisième parties de cette instruction SQL constituent deux requêtes Sélection. Ces requêtes récupèrent deux jeux distincts d’enregistrements : l’un issu de la table Commandes de produits et l’autre issu de la table Achats de produits.
La deuxième partie de cette SQL instruction est le UNION mot clé, qui indique à Access de combiner ces deux ensembles d’enregistrements.
La dernière partie de cette SQL instruction détermine l’ordre des enregistrements combinés à l’aide d’une ORDER BY instruction. Dans cet exemple, Access commande tous les enregistrements en fonction du champ Date de commande dans l’ordre décroissant.
Remarque
Les requêtes Union sont toujours en lecture seule dans Access ; vous ne pouvez pas modifier les valeurs dans le mode Feuille de données.
Créer une requête Union en créant et en combinant des requêtes Sélection
Même si vous pouvez créer une requête Union en écrivant la syntaxe directement dans le SQLmode SQL, il peut être plus facile de la créer en plusieurs parties avec des requêtes Select. Vous pouvez ensuite copier et coller les parties SQL dans une requête Union combinée.
Si vous préférez consulter un exemple plutôt que lire cette procédure, reportez-vous à la section ci-après intitulée Regarder un exemple de création d’une requête Union.
- Sous l’onglet Créer, dans le groupe Requêtes, cliquez sur Création de requête.
- Double-cliquez sur la table contenant les champs que vous souhaitez inclure. La table est ajoutée à la fenêtre de création de la requête.
- Dans la fenêtre de création de la requête, double-cliquez sur chacun des champs à inclure. Lors de la sélection des champs, assurez-vous d’ajouter le même nombre de champs, dans le même ordre, que ceux ajoutés aux autres requêtes Sélection. Soyez particulièrement attentif aux types de données des champs, et vérifiez qu’ils sont compatibles avec ceux des champs se trouvant à la même position dans les autres requêtes que vous combinez. Par exemple, si votre première requête Sélection comporte cinq champs, le premier d’entre eux contenant des données date/heure, assurez-vous que chacune des autres requêtes Sélection que vous combinez comporte également cinq champs dont le premier contient des données date/heure, et ainsi de suite.
- Vous pouvez éventuellement ajouter des critères à vos champs en tapant les expressions appropriées dans la ligne Critères de la grille de champs.
- Une fois que vous avez fini d’ajouter les champs et les critères de champs, vous devriez exécuter la requête Sélection et vérifier le résultat. Sous l’onglet Créer, dans le groupe Résultats, cliquez sur Exécuter.
- Basculez la requête en mode Création.
- Enregistrez la requête Sélection et laissez-la ouverte.
- Répétez cette procédure pour chacune des requêtes Sélection à combiner.
Maintenant que vous avez créé vos requêtes de sélection, il est temps de les combiner. Dans cette étape, vous créez la requête d’union en copiant et collant les SQL instructions.
- Sous l’onglet Créer, dans le groupe Requêtes, cliquez sur Création de requête.
- Dans l’onglet Conception du groupe Requête, cliquez sur Union. Access masque la fenêtre de création de requête et affiche l’onglet Objet SQL View . À ce stade, l’onglet est vide.
- Cliquez sur l’onglet de la première requête Sélection à combiner à la requête Union.
- Sous l’onglet Accueil, cliquez sur Afficher> ModeSQL.
- Copiez l’instruction
SQLde la requête de sélection. Cliquez sur l’onglet de la requête Union que vous avez commencé à créer précédemment. - Collez l’instruction
SQLde la requête select dans l’onglet d’objet SQL View de la requête Union. - Supprimez le point-virgule (
;) à la fin de l’instruction de requêteSQLselect. - Appuyez sur Entrée pour déplacer le curseur d’une ligne vers le bas, puis tapez
UNIONsur la nouvelle ligne. - Cliquez sur l’onglet de la requête Sélection suivante à combiner à la requête Union.
- Répétez les étapes 5 à 10 jusqu’à ce que vous ayez copié et collé toutes les instructions des
SQLrequêtes de sélection dans la fenêtre SQL View de la requête Union. Ne supprimez pas le point-virgule et ne tapez rien après l’instructionSQLde la requête Dernière sélection. - Sous l’onglet Créer, dans le groupe Résultats, cliquez sur Exécuter.
Les résultats de votre requête Union apparaissent dans le mode Feuille de données.
Visualiser un exemple de création d’une requête Union
Voici un exemple que vous pouvez recréer dans l’exemple de base de données Les Comptoirs. Cette requête Union recueille les noms des personnes de la table Clients et les combine avec les noms des personnes de la table Fournisseurs. Pour continuer, mettez en œuvre ces étapes dans votre base de données exemple Northwind.
Voici les étapes nécessaires pour créer cet exemple :
Créez deux requêtes Sélection appelées Requête1 et requête2 avec les tables Clients et Fournisseurs utilisées comme sources de données. Utilisez les champs Prénom et Nom comme valeurs d’affichage.
Créez une nouvelle requête appelée Requête3 sans source de données, puis cliquez sur la commande Union dans l’onglet Création pour faire de cette requête une requête Union.
Copiez et collez les instructions SQL de Requête1 et Requête2 dans Requête3. Assurez-vous de supprimer le point-virgule supplémentaire et ajoutez le
UNIONmot clé. Vous pouvez ensuite vérifier vos résultats dans le mode Feuille de données.Ajoutez une clause de commande à l’une des requêtes, puis collez l’instruction
ORDER BYdans la requête Union en mode SQL. Dans la requête Union, Requête3, les points-virgules puis le nom de table sont supprimés des noms de champ juste avant qu’ait lieu le classement des enregistrements.La finale
SQLqui combine et trie les noms pour cet exemple de requête Union est la suivante :SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
Si vous êtes très à l’aise SQL avec la syntaxe d’écriture, vous pouvez écrire votre propre SQL instruction pour la requête Union directement dans le mode SQL. Cependant, vous pouvez trouver utile d’effectuer des opérations de copier-coller de code SQL à partir d’autres objets de requête. Chaque requête peut être beaucoup plus complexe que les exemples simples de requête Sélection utilisés ici. Il peut être judicieux de créer et de tester soigneusement chaque requête avant de les combiner dans la requête Union. Si la requête Union ne s’exécute pas, vous pouvez ajuster chaque requête individuellement jusqu’à ce qu’elle réussisse, puis reconstruire votre requête Union avec la syntaxe corrigée.
Consultez les sections restantes de cet article pour en savoir plus sur les conseils et astuces sur l’utilisation des requêtes Union.
Combiner plusieurs tables ou requêtes dans une requête Union
Dans l’exemple de la section précédente qui utilise la base de données Northwind, les données de deux tables seulement sont combinées. Cependant, vous pouvez combiner très aisément trois tables ou plus dans une requête Union. Par exemple, en vous appuyant sur l’exemple précédent, vous souhaiterez peut-être inclure également les noms des employés dans le résultat de la requête. Pour accomplir cette tâche, vous pouvez ajouter une troisième requête et combiner l’instruction SQL précédente avec un mot-clé UNION supplémentaire comme suit :
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Lorsque vous affichez le résultat en mode Feuille de données, tous les employés sont répertoriés avec le nom de l’exemple de société, ce qui n’est probablement pas très utile. Si vous souhaitez que ce champ indique si une personne est un employé interne, d’un fournisseur ou d’un client, vous pouvez inclure une valeur fixe au lieu du nom de la société. Voici à quoi cela SQL ressemble :
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Voici comment le résultat apparaît dans le mode Feuille de données. Access affiche ces cinq enregistrements exemple :
| Emploi | Nom | Prénom |
|---|---|---|
| Interne | Hébert | Joséphine |
| Interne | Martin | Elisabeth |
| Fournisseur | Bellefeuille | Sydney |
| Client | Beaulieu | Marcel |
| Client | Davignon | Alain |
Vous pouvez réduire davantage la requête, car Access ne lit les noms des champs de sortie qu’à partir de la première requête d’une requête d’union. Ici, la sortie des deuxième et troisième sections de requête est supprimée :
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Filtrage dans les requêtes Union
Dans une requête Union Access, le classement n’est autorisé qu’une seule fois, mais vous pouvez filtrer chaque requête individuellement. En vous appuyant sur la requête Union de la section précédente, voici un exemple qui filtre chaque requête en ajoutant une WHERE clause.
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
Basculez dans le mode Feuille de données. Des résultats similaires à ceux-ci s’affichent alors :
| Emploi | Nom | Prénom |
|---|---|---|
| Fournisseur | Marquis | Ariane |
| Interne | Hébert | Joséphine |
| Client | Richer | Jonais |
| Interne | Brasseur | Danielle |
| Fournisseur | Hernandez | Marie |
| Client | Sorel | Blaise |
| Fournisseur | Bélisle | Mikael |
| Fournisseur | Sousa | Luis |
| Interne | Charron | Sébastien |
| Fournisseur | Hétu | Coralie |
| Interne | Belisle | Gerard |
Mélange de types de données
Si les requêtes que vous unissez sont très différentes, vous pouvez rencontrer une situation dans laquelle un champ en sortie doit combiner des données de types de données différents. Si c’est le cas, la requête Union renvoie le plus souvent les résultats en tant que données texte, car ce type de données peut contenir à la fois du texte et des nombres.
Pour comprendre le fonctionnement, nous utiliserons la requête Union Transactions de produits dans la base de données exemple Northwind. Ouvrez cette base de données exemple, puis ouvrez la requête Transactions de produit dans le mode Feuille de données. Les dix derniers enregistrements doivent être similaires à cette sortie :
| ID produit | Date de commande | Nom de société | Mouvement | Quantité |
|---|---|---|---|---|
| 77 | 22/01/2006 | Fournisseur B | Achat | 60 |
| 80 | 22/01/2006 | Fournisseur D | Achat | 75 |
| 81 | 22/01/2006 | Fournisseur A | Achat | 125 |
| 81 | 22/01/2006 | Fournisseur A | Achat | 200 |
| 7 | 20/01/2006 | Société D | Vente | 10 |
| 51 | 20/01/2006 | Société D | Vente | 10 |
| 80 | 20/01/2006 | Société D | Vente | 10 |
| 34 | 15/01/2006 | Société AA | Vente | 100 |
| 80 | 15/01/2006 | Société AA | Vente | 30 |
Supposons que vous souhaitiez fractionner le champ Quantité en deux champs : Acheter et Vendre. Supposons également que vous souhaitez une valeur zéro fixe pour le champ sans valeur. Voici à quoi ressemble cette SQL requête d’union :
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Si vous basculez dans le mode Feuille de données, les dix derniers enregistrements s’afficheront comme suit :
| ID produit | Date de commande | Nom de société | Mouvement | Achat | Vente |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Fournisseur B | Achat | 20 | 0 |
| 77 | 22/01/2006 | Fournisseur B | Achat | 60 | 0 |
| 80 | 22/01/2006 | Fournisseur D | Achat | 75 | 0 |
| 81 | 22/01/2006 | Fournisseur A | Achat | 125 | 0 |
| 81 | 22/01/2006 | Fournisseur A | Achat | 200 | 0 |
| 7 | 20/01/2006 | Société D | Vente | 0 | 10 |
| 51 | 20/01/2006 | Société D | Vente | 0 | 10 |
| 80 | 20/01/2006 | Société D | Vente | 0 | 10 |
| 34 | 15/01/2006 | Société AA | Vente | 0 | 100 |
| 80 | 15/01/2006 | Société AA | Vente | 0 | 30 |
En poursuivant cet exemple, que se passe-t-il si vous souhaitez que les champs avec des valeurs nulles soient vides ? Vous pouvez modifier la SQL pour ne rien afficher au lieu de zéro en ajoutant le Null mot clé, comme illustré ici :
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Toutefois, comme vous l’avez peut-être remarqué, en passant dans le mode Feuille de données, vous obtenez maintenant un résultat inattendu. Tous les champs de la colonnes Achat sont effacés :
| ID produit | Date de commande | Nom de société | Mouvement | Achat | Vente |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Fournisseur B | Achat | ||
| 77 | 22/01/2006 | Fournisseur B | Achat | ||
| 80 | 22/01/2006 | Fournisseur D | Achat | ||
| 81 | 22/01/2006 | Fournisseur A | Achat | ||
| 81 | 22/01/2006 | Fournisseur A | Achat | ||
| 7 | 20/01/2006 | Société D | Vente | 10 | |
| 51 | 20/01/2006 | Société D | Vente | 10 | |
| 80 | 20/01/2006 | Société D | Vente | 10 | |
| 34 | 15/01/2006 | Société AA | Vente | 100 | |
| 80 | 15/01/2006 | Société AA | Vente | 30 |
Cela se produit car Access détermine les types de données des champs à partir de la première requête. Dans cet exemple, Null n’est pas un nombre.
Que se passe-t-il si vous essayez d’insérer une chaîne vide pour la valeur vide des champs ? Le SQL pour cette tentative pourrait ressembler à ceci :
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Lorsque vous basculez dans le mode Feuille de données, Access affiche les valeurs d’Achat, mais celles-ci sont converties en texte. Ce sont des valeurs texte car elles sont alignées à gauche dans le mode Feuille de données. La chaîne vide de la première requête n’est pas un nombre, c’est pourquoi vous voyez ces résultats. Vous constaterez également que les valeurs de Vente sont également converties en texte, car les enregistrements d’Achat contiennent une chaîne vide.
| ID produit | Date de commande | Nom de société | Mouvement | Achat | Vente |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Fournisseur B | Achat | 20 | |
| 77 | 22/01/2006 | Fournisseur B | Achat | 60 | |
| 80 | 22/01/2006 | Fournisseur D | Achat | 75 | |
| 81 | 22/01/2006 | Fournisseur A | Achat | 125 | |
| 81 | 22/01/2006 | Fournisseur A | Achat | 200 | |
| 7 | 20/01/2006 | Société D | Vente | 10 | |
| 51 | 20/01/2006 | Société D | Vente | 10 | |
| 80 | 20/01/2006 | Société D | Vente | 10 | |
| 34 | 15/01/2006 | Société AA | Vente | 100 | |
| 80 | 15/01/2006 | Société AA | Vente | 30 |
Comment résoudre ce problème ?
Une solution consiste à forcer la requête à s’attendre à ce que la valeur de champ soit un nombre. Vous pouvez le faire avec cette expression :
IIf(False, 0, Null)
La condition de case activée est False, n’est jamais True, donc l’expression renvoie Nulltoujours . Toutefois, Access évalue toujours les deux options de sortie et traite la sortie comme numérique ou Null.
Voici comment nous pouvons utiliser cette expression dans notre exemple de travail :
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Vous n’avez pas besoin de modifier la deuxième requête.
Si vous basculez dans le mode Feuille de données, vous verrez le résultat attendu :
| ID produit | Date de commande | Nom de société | Mouvement | Achat | Vente |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Fournisseur B | Achat | 20 | |
| 77 | 22/01/2006 | Fournisseur B | Achat | 60 | |
| 80 | 22/01/2006 | Fournisseur D | Achat | 75 | |
| 81 | 22/01/2006 | Fournisseur A | Achat | 125 | |
| 81 | 22/01/2006 | Fournisseur A | Achat | 200 | |
| 7 | 20/01/2006 | Société D | Vente | 10 | |
| 51 | 20/01/2006 | Société D | Vente | 10 | |
| 80 | 20/01/2006 | Société D | Vente | 10 | |
| 34 | 15/01/2006 | Société AA | Vente | 100 | |
| 80 | 15/01/2006 | Société AA | Vente | 30 |
Pour obtenir le même résultat, une méthode alternative consiste à utiliser une requête qui préfixe les requêtes dans la requête Union :
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
Pour chaque champ, Access renvoie des valeurs fixes du type de données que vous définissez. Bien entendu, vous ne souhaitez pas que la sortie de cette requête interfère avec les résultats ; pour éviter cela, l’astuce consiste à inclure une clause WHERE dans False :
WHERE False
C’est une petite astuce. Étant donné que la condition est toujours fausse, la requête ne renvoie rien. La combinaison de cette instruction avec le code SQL existant produit la déclaration terminée suivante :
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Remarque
Dans cet exemple, la requête combinée de la base de données Les Comptoirs renvoie 100 enregistrements, tandis que les deux requêtes individuelles renvoient 58 et 43 enregistrements, pour un total de 101 enregistrements. Cette différence se produit parce que deux enregistrements ne sont pas uniques. Voir Utilisation d’enregistrements distincts dans des requêtes Union à l’aide de UNION ALL pour découvrir comment résoudre ce scénario à l’aide UNION ALLde .
Ajout de totaux dans une requête Union
Une requête d’union est particulièrement utile pour combiner un jeu d’enregistrements avec un enregistrement qui contient la somme d’un ou de plusieurs champs.
Voici un autre exemple que vous pouvez créer dans la base de données exemple Northwind pour illustrer la façon d’obtenir un total dans une requête Union.
Créez une requête simple pour afficher l’achat de bières (ID de produit=34 dans la base de données Northwind) à l’aide de la syntaxe SQL suivante :
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];Basculez dans le mode Feuille de données. Les quatre achats suivants doivent alors apparaître :
Date de réception Quantité 22/01/2006 100 22/01/2006 60 04/04/2006 50 05/04/2006 300 Pour obtenir le total, créez une requête d’agrégation simple à l’aide du code SQL suivant :
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))Basculez dans le mode Feuille de données. Un seul enregistrement doit alors apparaître :
MaxOfDate reçu SumOfQuantity 05/04/2006 510 Combinez ces deux requêtes dans une requête Union pour adjoindre l’enregistrement à la quantité totale des enregistrements d’achat :
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];Basculez dans le mode Feuille de données. Les quatre achats suivants doivent alors apparaître avec la somme suivie par un enregistrement totalisant la quantité :
Date de réception Quantité 22/01/2006 60 22/01/2006 100 04/04/2006 50 05/04/2006 300 05/04/2006 510
Les concepts de base de l’ajout de totaux dans une requête Union sont abordés. Vous pouvez également inclure des valeurs fixes dans les deux requêtes, telles que « Détail » et « Total », pour séparer visuellement l’enregistrement total des autres enregistrements. Vous pouvez vous reporter à l’utilisation de valeurs fixes à la section Combiner plusieurs tables ou requêtes dans une requête Union.
Utilisation d’enregistrements distincts dans les requêtes Union à l’aide d’UNION ALL
Dans Access, les requêtes Union par défaut incluent uniquement des enregistrements distincts. À présent, que faire si vous voulez inclure tous les enregistrements ? Un autre exemple peut s’avérer utile dans ce cas.
Dans la section précédente, nous vous avons montré comment créer un total dans une requête Union. Modifiez cette requête SQL d’union pour inclure Product ID = 48:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
Basculez dans le mode Feuille de données. Un résultat quelque peu trompeur apparaît :
| Date de réception | Quantité |
|---|---|
| 22/01/2006 | 100 |
| 22/01/2006 | 200 |
Bien sûr, un enregistrement ne renvoie pas deux fois la quantité totale.
Vous obtenez ce résultat car, un jour, la même quantité de chocolats a été vendue deux fois, comme indiqué dans la table Détails bon de commande. Voici le résultat d’une requête de sélection simple montrant les deux enregistrements dans la base de données exemple Northwind :
| Réf bon de commande | Produit | Quantity |
|---|---|---|
| 100 | Northwind Traders Chocolate | 100 |
| 92 | Northwind Traders Chocolate | 100 |
Dans la requête Union mentionnée précédemment, vous pouvez voir que le champ N° commande fournisseur n’est pas inclus et que les deux champs ne constituent pas deux enregistrements distincts.
Si vous souhaitez inclure tous les enregistrements, utilisez UNION ALL plutôt que UNION dans votre SQL. Cela affectera probablement le tri des résultats. Vous pouvez donc également inclure une ORDER BY clause pour déterminer un ordre de tri. Voici la version modifiée SQL par rapport à l’exemple précédent :
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
Basculez dans le mode Feuille de données. Dans le résultat détaillé, le total s’affiche comme dernier enregistrement :
| Date de réception | Total | Quantité |
|---|---|---|
| 22/01/2006 | 100 | |
| 22/01/2006 | 100 | |
| 22/01/2006 | Total | 200 |
Utiliser une requête Union pour filtrer les enregistrements d’un formulaire par le biais d’un contrôle de zone de liste déroulante
Il est courant qu’une requête Union serve de source d’enregistrement pour un contrôle de zone de liste déroulante sur un formulaire. Vous pouvez utiliser cette zone de liste déroulante pour sélectionner une valeur de filtrage des enregistrements du formulaire. Par exemple, le filtrage trie les enregistrements des employés par ville.
Voici un autre exemple que vous pouvez créer dans la base de données exemple Northwind pour illustrer ce scénario.
Créez une requête Sélection simple à l’aide de la syntaxe suivante
SQL:SELECT Employees.City, Employees.City AS Filter FROM Employees;Basculez dans le mode Feuille de données. Les résultats suivants doivent alors apparaître :
Ville Filtre Toulouse Toulouse Bellevue Bellevue Paris Paris Strasbourg Strasbourg Toulouse Toulouse Paris Paris Toulouse Toulouse Paris Paris Toulouse Toulouse Vous pouvez constater que les résultats de cette requête ne sont pas satisfaisants. Développez cependant la requête et transformez-la en requête Union en utilisant les éléments suivants
SQL:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;Basculez dans le mode Feuille de données. Les résultats suivants doivent alors apparaître :
Ville Filtre <Tous> * Bellevue Bellevue Strasbourg Strasbourg Paris Paris Toulouse Toulouse Access effectue l’union des neuf enregistrements mentionnés précédemment avec des valeurs de champ fixes : <Tous> et « * ». Étant donné que cette clause d’union ne contient
UNION ALLpas , Access renvoie uniquement des enregistrements distincts. Cela signifie que chaque ville n’est renvoyée qu’une seule fois avec des valeurs identiques fixes.Maintenant que vous avez une requête Union complète affichant chaque nom de ville une seule fois, avec une option qui sélectionne effectivement toutes les villes, vous pouvez utiliser cette requête comme source d’enregistrement pour une zone de liste déroulante sur un formulaire. À l’aide de cet exemple en tant que modèle, vous pouvez créer un contrôle de zone de liste déroulante sur un formulaire, définir cette requête en tant que source d’enregistrement, définir la propriété Column Width (Largeur de colonne) de la colonne Filter (Filtre) sur 0 (zéro) pour le masquer, puis définir la propriété Bound Column (Colonne de liaison) sur 1 pour indiquer l’index de la deuxième colonne. Dans la
Filterpropriété du formulaire lui-même, vous pouvez ensuite ajouter du code comme suit pour activer un filtre de formulaire à l’aide de la valeur sélectionnée dans le contrôle zone de liste déroulante :Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueL’utilisateur du formulaire peut ensuite filtrer les enregistrements du formulaire sur un nom de ville spécifique ou sélectionner <Tous> pour répertorier tous les enregistrements pour toutes les villes.
Haut de la page