Parfois, vous pouvez combiner des enregistrements d’une table ou d’une requête avec des enregistrements d’une ou de 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 de travail dans le modèle Northwind Access. Vous pouvez rechercher l’exemple de modèle Northwind dans la page prise en main d’Access en sélectionnant Fichier>Nouveau. 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 Northwind, fermez la boîte de dialogue de connexion qui s’affiche pour la première fois, puis développez le volet de navigation. Sélectionnez le haut du volet de navigation, puis sélectionnez 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. Cela signifie que vous ne pouvez 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 surAffichages>d’accueil>SQL pour afficher la syntaxe qui le SQL définit. Dans cette illustration, nous avons ajouté un espacement supplémentaire dans le SQL afin 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 union à partir 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 la UNION mot clé, qui indique à Access de combiner ces deux jeux 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 classe 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 la SQLvue SQL, il peut être plus facile de la générer en parties avec des requêtes sélectionnées. 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 sélectionnées, il est temps de les combiner. Dans cette étape, vous créez la requête 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 conception de requête et affiche l’onglet de l’objet Vue SQL . À 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 la>vue SQL.
- Copiez l’instruction
SQLpour la requête select. 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 objet Vue SQL 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
SQLinstructions pour les requêtes select dans la fenêtre Vue SQL de la requête union. Ne supprimez pas le point-virgule ou ne tapez rien après l’instructionSQLde la dernière requête select. - 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 Northwind. 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. Veillez à supprimer le point-virgule supplémentaire et à ajouter le
UNIONmot clé. Vous pouvez ensuite vérifier vos résultats dans le mode Feuille de données.Ajoutez une clause de classement à 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.Le dernier
SQLqui combine et trie les noms de cet exemple de requête union est le suivant :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 dans l’écriture SQL de la syntaxe, vous pouvez écrire votre propre SQL instruction pour la requête union directement dans la vue 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 uniquement 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 l’exemple de nom 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, un fournisseur ou un client, vous pouvez inclure une valeur fixe au lieu du nom de l’entreprise. Voici à quoi ressemble le SQL :
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 encore davantage la requête, car Access lit les noms des champs de sortie uniquement à partir de la première requête d’une requête 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 s’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 mettez en union sont très différentes, vous pouvez rencontrer une situation dans laquelle un champ de sortie doit combiner des données de différents types de données. 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 diviser le champ Quantité en deux champs : Acheter et Vendre. Supposons également que vous souhaitiez une valeur zéro fixe pour le champ sans valeur. Voici à quoi ressemble pour SQL cette 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 |
Pour poursuivre cet exemple, que se passe-t-il si vous souhaitez que les champs avec des valeurs zéro soient vides ? Vous pouvez modifier le SQL pour n’afficher rien 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 peut 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 du champ soit un nombre. Vous pouvez le faire avec cette expression :
IIf(False, 0, Null)
La condition à case activée, False, n’est jamais True, donc l’expression retourne 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 un petit truc. Étant donné que la condition est toujours false, la requête ne retourne 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 dans la base de données Northwind retourne 100 enregistrements, tandis que les deux requêtes individuelles retournent 58 et 43 enregistrements pour un total de 101 enregistrements. Cette différence se produit parce que deux enregistrements ne sont pas uniques. Consultez Utilisation d’enregistrements distincts dans des requêtes union à l’aide de UNION ALL pour savoir comment résoudre ce scénario à l’aide de UNION ALL.
Ajout de totaux dans une requête Union
Une utilisation spéciale pour une requête union consiste à combiner un jeu d’enregistrements avec un enregistrement qui contient la somme d’un ou 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 « Detail » 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 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 retourne pas le double de la quantité totale.
Vous voyez ce résultat car, un jour, la même quantité de chocolats a été vendue deux fois, comme indiqué dans la table Détails du 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 précédemment indiquée, vous pouvez voir que le champ ID du bon de commande 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 au lieu de 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 modification basée SQL sur 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 select 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 la requête, cependant, 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 une union des neuf enregistrements, précédemment affichés, avec des valeurs de champ fixes de <All> et « * ». Étant donné que cette clause union ne contient
UNION ALLpas , Access retourne uniquement des enregistrements distincts. Cela signifie que chaque ville n’est retourné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 semblable à ce qui suit pour activer un filtre de formulaire à l’aide de la valeur sélectionnée dans le contrôle de zone de liste déroulante :Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueL’utilisateur du formulaire peut ensuite filtrer les enregistrements de formulaire sur un nom de ville spécifique ou sélectionner <Tout> pour répertorier tous les enregistrements pour toutes les villes.
Haut de la page