Utiliser une requête Union pour combiner plusieurs requêtes dans un seul résultat
Applies ToAccess pour Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

Il se peut que vous ayez à répertorier les enregistrements d’une table ou d’une requête avec ceux d’une ou de plusieurs autres tables afin de former un jeu d’enregistrements, c’est-à-dire la liste de tous les enregistrements des deux tables ou plus. C’est l’objet d’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, vous pouvez trouver utile d’étudier un exemple fonctionnel dans le modèle Northwind d’Access. Vous pouvez effectuer une recherche dans le modèle exemple Northwind sur la page de démarrage d’Access en cliquant sur Fichier > Nouveau ou vous pouvez directement télécharger une copie à partir de cet emplacement : Modèle exemple Northwind.

Après qu’Access a ouvert la base de données Northwind, fermez le formulaire de connexion qui s’affiche, puis développez le volet de navigation. Cliquez sur la partie supérieure du volet de navigation, puis sélectionnez Type d’objet pour organiser tous les objets de base de données selon leur type. Développez ensuite le groupe Requêtes afin d’afficher la requête Transactions de produits.

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 :

Capture d’écran de l’icône de requête Union dans Access.

Contrairement aux requêtes Sélection et Action normales, les tables ne sont pas liées dans une requête Union, ce qui signifie que le Concepteur de requêtes graphique d’Access ne permet pas de créer ou de modifier des requêtes Union. Cette situation se produit si vous ouvrez une requête Union à partir du volet de navigation ; Access ouvre celle-ci, puis affiche les résultats dans le mode Feuille de données. Sous la commande Affichages de l’onglet Accueil, le mode Création n’est pas disponible lorsque vous travaillez avec les requêtes Union. Le mode Feuille de données et le mode SQL sont les deux modes dans lesquels vous pouvez traiter des requêtes Union.

Pour poursuivre votre étude de cet exemple de requête Union et afficher la syntaxe SQL correspondante, cliquez sur Accueil > Affichages > Mode SQL. Dans cette illustration, nous avons ajouté des espaces supplémentaires au sein du code SQL pour distinguer les différentes parties qui composent une requête Union.

Votre navigateur ne prend pas en charge la vidéo. Installez Microsoft Silverlight, Adobe Flash Player ou Internet Explorer 9.

Étudions en détail la syntaxe SQL 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.

Le mot clé UNION, qui constitue la deuxième partie de cette instruction SQL, indique à Access que cette requête va combiner ces deux jeux d’enregistrements.

Dans la dernière partie de l’instruction SQL, ORDER BY détermine le classement des enregistrements combinés. Dans cet exemple, Access classe tous les enregistrements sur le champ Date de commande par 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 directement la syntaxe SQL dans l’affichage SQL, vous trouverez peut-être plus facile de la construire en plusieurs parties avec des requêtes Sélection. 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.

  1. Sous l’onglet Créer, dans le groupe Requêtes, cliquez sur Création de requête.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. Basculez la requête en mode Création.

  7. Enregistrez la requête Sélection et laissez-la ouverte.

  8. Répétez cette procédure pour chacune des requêtes Sélection à combiner.

À présent que vous avez créé vos requêtes Sélection, vous allez les combiner. Au cours de cette étape, vous créez la requête Union en copiant et collant les instructions SQL.

  1. Sous l’onglet Créer, dans le groupe Requêtes, cliquez sur Création de requête.

  2. 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 Mode SQL de l’objet. À ce stade, l’onglet Mode SQL de l’objet est vide.

  3. Cliquez sur l’onglet de la première requête Sélection à combiner à la requête Union.

  4. Sous l’onglet Accueil, cliquez sur Affichage > Mode SQL.

  5. Copiez l’instruction SQL pour la requête Sélection. Cliquez sur l’onglet de la requête Union que vous avez commencé à créer précédemment.

  6. Collez l’instruction SQL pour la requête Sélection dans l’onglet Mode SQL de l’objet de la requête Union.

  7. Supprimez le point-virgule (;) à la fin de l’instruction SQL de la requête Sélection.

  8. Appuyez sur Entrée pour déplacer le curseur d’une ligne vers le bas, puis tapez UNION sur la nouvelle ligne.

  9. Cliquez sur l’onglet de la requête Sélection suivante à combiner à la requête Union.

  10. Répétez les étapes 5 à 10 jusqu’à ce que toutes les instructions SQL pour les requêtes Sélection aient été copiées-collées dans la fenêtre Mode SQL de la requête Union. Ne supprimez pas le point-virgule ou ne tapez rien à la suite de l’instruction SQL de la dernière requête Sélection.

  11. 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 la base de données exemple 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.

Votre navigateur ne prend pas en charge la vidéo. Installez Microsoft Silverlight, Adobe Flash Player ou Internet Explorer 9.

Voici les étapes nécessaires pour créer cet exemple :

  1. 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.

  2. 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.

  3. 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 mot-clé UNION. Vous pouvez ensuite vérifier vos résultats dans le mode Feuille de données.

  4. Ajoutez une clause de commande dans l’une des requêtes, puis collez l’instruction ORDER BY dans l’affichage SQL de la requête Union. 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.

  5. Dans cet exemple de requête Union, le code SQL final qui combine et trie les noms 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 maîtrisez parfaitement l’écriture de la syntaxe SQL, vous pouvez certainement écrire votre instruction SQL de requête Union dans l’affichage 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.

Dans l’exemple de la section précédente utilisant la base de données Northwind, seules les données de deux tables 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 dans le mode Feuille de données, tous les employés sont répertoriés avec le nom de l’entreprise exemple, ce qui n’est sans doute 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 à la place du nom de l’entreprise. Voici à quoi ressemblera alors le code 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

La requête ci-dessus peut être encore réduite car Access lit uniquement les noms des champs de sortie de la première requête dans une requête Union. Vous pouvez constater que nous avons supprimé le résultat des deuxième et troisième sections de requête :

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];

Dans une requête Union Access, le classement n’est autorisé qu’une fois, mais chaque requête peut être filtrée individuellement. En nous basant sur la requête Union de la section précédente, voici un exemple dans lequel nous avons ajouté une clause WHERE pour filtrer chaque requête.

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

Si les requêtes Union sont très différentes, vous pouvez vous dans une situation où un champ de 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 de 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 scinder le champ Quantité en Achat et Vente. Supposons également que vous vouliez une valeur nulle fixe pour le champ sans valeur. Voici à quoi ressemblera le code SQL pour cette requête 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 de 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 avec cet exemple, que faire si vous voulez que les champs avec zéro soient vides ? Vous pouvez ajouter le mot clé Null dans le code SQL pour supprimer les zéros et ne rien afficher :

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 de 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 comme valeur vide des champs ? Le code SQL de 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 de 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 à attendre que la valeur du champ soit un nombre. Cela peut être réalisé avec l’expression suivante :

IIf(False, 0, Null)

La condition à vérifier, False, ne sera jamais True, ce qui signifie que l’expression retournera toujours Null , mais qu’Access évaluera toujours les deux options pour décider si la valeur de sortie est 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;

Notez qu’il n’est pas nécessaire de modifier la deuxième requête.

Si vous basculez dans le mode Feuille de données, vous verrez le résultat attendu :

ID de 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

Il s’agit d’un clin d’œil puisque la condition est toujours fausse et que 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 : La requête combinée dans cet exemple utilisant la base de données Northwind renvoie 100 enregistrements, tandis que les deux requêtes individuelles renvoient 58 et 43 enregistrements, soit un total de 101 enregistrements. Cette différence est due au fait que deux enregistrements ne sont pas uniques. Pour en savoir plus sur la résolution de ce problème avec UNION ALL, consultez la section Utilisation d’enregistrements distincts dans les requêtes à l’aide d’UNION ALL.

Dans un cas particulier, une requête Union peut combiner un jeu d’enregistrements avec un seul 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.

  1. 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];
  2. 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

  3. 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))
  4. Basculez dans le mode Feuille de données. Un seul enregistrement doit alors apparaître :

    MaxOfDate reçu

    SumOfQuantity

    05/04/2006

    510

  5. 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];
  6. 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 » afin de 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.

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 de façon à 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 entendu, un enregistrement ne renvoie pas deux fois la quantité totale.

Ce résultat est produit car la même quantité de chocolats a été vendue deux fois le même jour, comme indiqué dans la table Détails de la 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

Product

Quantity

100

Northwind Traders Chocolate

100

92

Northwind Traders Chocolate

100

Dans la requête Union précédemment notée, vous pouvez constater que le champ ID commande est absent et que les deux champs ne constituent pas deux enregistrements distincts.

Si vous voulez inclure tous les enregistrements, utilisez UNION ALL au lieu de UNION dans votre code SQL. Cela aura probablement un impact sur le tri des résultats : vous pouvez donc également inclure une clause ORDER BY pour déterminer un ordre de tri. Voici la structure SQL modifiée de 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

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.

  1. Créez une requête de sélection simple utilisant cette syntaxe SQL :

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. 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

  3. Vous pouvez constater que les résultats de cette requête ne sont pas satisfaisants. Développez la requête et transformez-la en requête Union en utilisant le code SQL suivant :

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. Basculez dans le mode Feuille de données. Les résultats suivants doivent alors apparaître :

    Ville

    Filtre

    <All>

    *

    Bellevue

    Bellevue

    Strasbourg

    Strasbourg

    Paris

    Paris

    Toulouse

    Toulouse

    Access effectue l’union des neuf enregistrements, précédemment affichés, avec des valeurs de champ fixes <All> et « * ».

    Comme cette clause d’union ne contient pas UNION ALL, Access ne renvoie que des enregistrements distincts, ce qui signifie que chaque ville est renvoyée une seule fois avec des valeurs identiques fixes.

  5. 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 propriété Filter (Filtre) du formulaire lui-même, vous pouvez ensuite ajouter du code comme suit pour activer un filtre de formulaire en utilisant la valeur de la sélection dans le contrôle de zone de liste déroulante :

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    L’utilisateur du formulaire peut ensuite filtrer les enregistrements du formulaire sur un nom de ville spécifique ou sélectionner <All> pour dresser la liste de tous les enregistrements de toutes les villes.

Haut de la page

Besoin d’aide ?

Vous voulez plus d’options ?

Explorez les avantages de l’abonnement, parcourez les cours de formation, découvrez comment sécuriser votre appareil, etc.

Les communautés vous permettent de poser des questions et d'y répondre, de donner vos commentaires et de bénéficier de l'avis d'experts aux connaissances approfondies.