Utiliser une requête Union pour combiner plusieurs requêtes en un seul résultat

S’applique à
Access pour Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

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 :

Capture d’écran d’une icône de requête union dans Access. 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.

  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.

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.

  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 conception de requête et affiche l’onglet de l’objet Vue SQL . À ce stade, l’onglet 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 Afficher la>vue SQL.
  5. Copiez l’instruction SQL pour la requête select. Cliquez sur l’onglet de la requête Union que vous avez commencé à créer précédemment.
  6. Collez l’instruction SQL de la requête select dans l’onglet objet Vue SQL de la requête union.
  7. Supprimez le point-virgule (;) à la fin de l’instruction de requête SQL select.
  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 vous ayez copié et collé toutes les SQL instructions 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’instruction SQL de la dernière requête select.
  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 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 :

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

  4. Ajoutez une clause de classement à l’une des requêtes, puis collez l’instruction ORDER BY dans 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.

  5. Le dernier SQL qui 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.

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

  1. Créez une requête select simple à l’aide de la syntaxe suivante 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, 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;
    
  4. 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.

  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 Filter proprié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 = True
    

    L’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