De resultaten van verschillende query's combineren met een samenvoegquery

De resultaten van verschillende query's combineren met een samenvoegquery

Soms wilt u misschien de records van een tabel of query weergeven met de records van een of meer andere tabellen om één set records te vormen: een lijst met alle records uit twee of meer tabellen. Dit is het doel van een samenvoegquery in Access.

Om samenvoegquery's goed te kunnen begrijpen, moet u eerst vertrouwd zijn met het ontwerpen van eenvoudige selectiequery's in Access. Zie Een eenvoudige selectiequery maken voor meer informatie over het ontwerpen van selectiequery's.

Opmerking: De inhoud van dit artikel is bedoeld voor gebruik met Access-desktopdatabases. U kunt geen samenvoegquery's maken of gebruiken in Access-webdatabases of -web-apps.

Een voorbeeld van een werkende samenvoegquery bekijken

Als u nog nooit eerder een samenvoegquery hebt gemaakt, is het misschien handig om eerst een werkend voorbeeld in de Northwind-sjabloon van Access te bestuderen. U kunt zoeken naar de Northwind-voorbeeldsjabloon op de pagina Aan de slag van Access door te klikken op Bestand > Nieuw of u kunt rechtstreeks een kopie downloaden vanaf deze locatie: Northwind-voorbeeldsjabloon.

Wanneer de Northwind-database is geopend in Access, sluit u het aanmeldingsvenster dat eerst wordt weergegeven en vouwt u het navigatiedeelvenster uit. Klik boven in het navigatiedeelvenster en selecteer Objecttype om alle databaseobjecten te rangschikken op type. Vouw vervolgens de groep Query's uit, waarna u de query Producttransacties ziet.

Samenvoegquery's zijn gemakkelijk te onderscheiden van andere queryobjecten omdat deze een speciaal pictogram hebben die lijkt op twee verweven cirkels waarmee een samengevoegde set van twee groepen wordt aangegeven:

Schermafbeelding van het pictogram van een samenvoegquery in Access.

In tegenstelling tot normale selectie- en actiequery's zijn tabellen niet gerelateerd in een samenvoegquery. Dit houdt in dat de grafische queryontwerpfunctie van Access niet kan worden gebruikt om samenvoegquery's te maken of te bewerken. Dit gebeurt als u een samenvoegquery opent vanuit het navigatiedeelvenster. Deze wordt geopend en de resultaten worden weergegeven in de gegevensbladweergave. Onder de opdracht Weergaven op het tabblad Start ziet u dat Ontwerpweergave niet beschikbaar is wanneer u met samenvoegquery's werkt. U kunt alleen schakelen tussen Gegevensbladweergave en SQL-weergave wanneer u met samenvoegquery's werkt.

Als u wilt verdergaan met dit voorbeeld van een samenvoegquery, klikt u op Start > Weergaven > SQL-weergave om de SQL-syntaxis te bekijken waarmee de samenvoegquery is gedefinieerd. In deze afbeelding hebben we wat extra afstand in de SQL toegevoegd zodat u de verschillende onderdelen van een samenvoegquery eenvoudig kunt bekijken.

Uw browser biedt geen ondersteuning voor video. Installeer Microsoft Silverlight, Adobe Flash Player of Internet Explorer 9.

We gaan nu de SQL-syntaxis van deze samenvoegquery in de Northwind-database nader bestuderen:

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;

Het eerste en derde gedeelte van deze SQL-instructie zijn eigenlijk twee selectiequery's. Met deze query's worden twee verschillende recordsets opgehaald: één uit de tabel Productorders en één uit de tabel Productinkoop.

Het tweede gedeelte van deze SQL-instructie is het trefwoord UNION waarmee in Access wordt aangegeven dat deze twee recordsets worden gecombineerd met deze query.

Het laatste gedeelte van deze SQL-instructie bepaalt de volgorde van de gecombineerde records met de instructie ORDER BY. In dit voorbeeld worden alle records geordend op het veld Orderdatum in aflopende volgorde.

Opmerking: Samenvoegquery's zijn altijd alleen-lezen in Access. U kunt geen waarden wijzigen in de gegevensbladweergave.

Een samenvoegquery maken door selectiequery's te maken en te combineren

Hoewel u een samenvoegquery kunt maken door de SQL-syntaxis rechtstreeks te schrijven in de SQL-weergave, vindt u het misschien makkelijker om deze in delen te maken met een selectiequery. U kunt de SQL-delen vervolgens kopiëren en in een gecombineerde samenvoegquery plakken.

Zie de volgende sectie Een voorbeeld van het maken van een samenvoegquery bekijken als u niet verder wilt lezen en in plaats hiervan een voorbeeld wilt bekijken.

  1. Klik op het tabblad Maken in de groep Query's op Queryontwerp.

  2. Dubbelklik in het dialoogvenster Tabel weergeven op de tabel met de velden die u wilt toevoegen. De tabel wordt toegevoegd aan het queryontwerpvenster.

  3. Sluit het dialoogvenster Tabel weergeven.

  4. Dubbelklik in het queryontwerpvenster op elk veld dat u wilt toevoegen. Zorg er bij het selecteren van de velden voor dat u evenveel velden toevoegt als aan de andere selectiequery's en dat u ze in dezelfde volgorde toevoegt. Let op dat de gegevenstypen van de velden compatibel zijn met de gegevenstypen van velden in dezelfde positie in de andere query's die u combineert. Als uw eerste selectiequery bijvoorbeeld vijf velden heeft en het eerste veld gegevens van het type Datum/tijd bevat, moet u ervoor zorgen dat alle andere selectiequery's die u combineert, ook vijf velden hebben, met als eerste een veld van het type Datum/tijd, enzovoort.

  5. Voeg desgewenst criteria aan de velden toe door de juiste expressies te typen in de rij Criteria van het veldraster.

  6. Wanneer u klaar bent met het toevoegen van velden en veldcriteria, voert u de selectiequery uit en controleert u de queryresultaten. Klik op het tabblad Ontwerpen in de groep Resultaten op itvoeren.

  7. Schakel over naar de ontwerpweergave.

  8. Sla de selectiequery op en laat deze open.

  9. Herhaal deze procedure voor elke selectiequery die u wilt combineren.

Nu u uw selectiequery hebt gemaakt, is het tijd om deze te combineren. In deze stap maakt u de samenvoegquery door de SQL-instructies te kopiëren en te plakken.

  1. Klik op het tabblad Maken in de groep Query's op Queryontwerp.

  2. Sluit het dialoogvenster Tabel weergeven.

  3. Klik op het tabblad Ontwerp in de groep Query op Samenvoegquery. Het venster voor queryontwerp wordt verborgen en u ziet het objecttabblad van de SQL-weergave, dat in dit stadium leeg is.

  4. Klik op de tab voor de eerste selectiequery die u in de samenvoegquery wilt combineren.

  5. Klik op het tabblad Start op Weergave > SQL-weergave.

  6. Kopieer de SQL-instructie voor de selectiequery. Klik op de tab voor de samenvoegquery waarmee u eerder bent begonnen.

  7. Plak de SQL-instructie voor de selectiequery in het objecttabblad van de SQL-weergave van de samenvoegquery.

  8. Verwijder de puntkomma (;) aan het eind van de SQL-instructie voor de selectiequery.

  9. Druk op Enter om de cursor naar de volgende regel te verplaatsen en typ UNION op de nieuwe regel.

  10. Klik op de tab voor de volgende selectiequery die u in de samenvoegquery wilt combineren.

  11. Herhaal stap 5 tot en met 10 totdat u alle SQL-instructies voor de selectiequery's naar het SQL-weergavevenster van de samenvoegquery hebt gekopieerd. Laat de puntkomma aan het eind van de SQL-instructie voor de laatste selectiequery staan en typ niets achter deze puntkomma.

  12. Ga naar het tabblad Ontwerp en klik in de groep Resultaten op Uitvoeren.

De resultaten van uw samenvoegquery worden weergegeven in de gegevensbladweergave.

Een voorbeeld van het maken van een samenvoegquery bekijken

Hier ziet u een voorbeeld dat u kunt namaken in de Northwind-voorbeelddatabase. Met deze samenvoegquery worden de namen van personen uit de tabel Klanten verzameld en worden deze gecombineerd met de namen van personen uit de tabel Leveranciers. Als u dit ook wilt doen, voert u deze stappen uit in uw exemplaar van de Northwind-voorbeelddatabase.

Uw browser biedt geen ondersteuning voor video. Installeer Microsoft Silverlight, Adobe Flash Player of Internet Explorer 9.

Dit zijn de stappen voor het maken van dit voorbeeld:

  1. Maak twee selectiequery's met de naam Query1 en Query2 met als gegevensbron respectievelijk de tabellen Klanten en Leveranciers. Gebruik de velden Voornaam en Achternaam als weergavewaarden.

  2. Maak een nieuwe query met de naam Query3 in eerste instantie zonder gegevensbron en klik op de opdracht Samenvoegquery op het tabblad Ontwerp om van deze query een samenvoegquery te maken.

  3. Kopieer en plak de SQL-instructies van Query1 en Query2 in Query3. Verwijder de extra puntkomma en voeg het trefwoord UNION toe. U kunt de resultaten nu controleren in de gegevensbladweergave.

  4. Voeg een volgordecomponent toe aan een van de query's en plak de ORDER BY-instructie in de SQL-weergave van de samenvoegquery. Wanneer de volgordecomponent wordt toegevoegd, ziet u dat in Query3, de samenvoegquery, eerst de puntkomma's worden verwijderd en daarna de tabelnaam uit de veldnamen wordt verwijderd.

  5. Dit is de laatste SQL waarmee de namen voor dit samenvoegqueryvoorbeeld worden gecombineerd en gesorteerd:

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

Als u vertrouwd bent met het schrijven van SQL-syntaxis, kunt u uw eigen SQL-instructie voor de samenvoegquery rechtstreeks in de SQL-weergave maken. Het kan echter handig zijn om SQL van andere queryobjecten te kopiëren en te plakken. Elke query kan veel ingewikkelder zijn dan de voorbeelden van de eenvoudige selectiequery's die hier worden gebruikt. Het is nuttig om elke query te maken en uitgebreid te testen voordat u deze combineert in de samenvoegquery. Als de samenvoegquery niet wordt uitgevoerd, kunt u elke query afzonderlijk aanpassen totdat deze wel wordt uitgevoerd en uw samenvoegquery vervolgens opnieuw maken met de gecorrigeerde syntaxis.

Bekijk de resterende secties van dit artikel voor meer tips en trucs voor het gebruik van samenvoegquery's.

In het voorbeeld van de vorige sectie met de Northwind-database worden gegevens uit slechts twee tabellen gecombineerd. U kunt echter eenvoudig drie of meer tabellen combineren in een samenvoegquery. Als we verder gaan met het vorige voorbeeld kunnen we bijvoorbeeld ook de namen van de werknemers in de queryuitvoer opnemen. U kunt dit doen door een derde query toe te voegen en deze te combineren met de vorige SQL-instructie met een extra UNION-trefwoord, zoals u hier ziet:

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

Wanneer u het resultaat bekijkt in de gegevensbladweergave, worden alle werknemers weergegeven met de naam van het voorbeeldbedrijf, wat misschien niet erg handig is. Als u met dit veld wilt aangeven of een persoon een interne werknemer, een werknemer van een leverancier of een werknemer van een klant is, kunt u een vaste waarde opnemen in plaats van de bedrijfsnaam. De SQL ziet er dan als volgt uit:

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

Het resultaat ziet er zo uit in de gegevensbladweergave. In Access worden deze vijf voorbeeldrecords weergegeven:

Dienstverband

Achternaam

Voornaam

Intern

Plant

Fenna

Intern

Gunther

Elsemiek

Leverancier

Spel

Stefan

Klant

Kregel

Floris

Klant

Neumann

Roelf

De bovenstaande query kan nog verder worden beperkt omdat in Access alleen de namen van de uitvoervelden in de eerste query in een samenvoegquery worden gelezen. U ziet hier dat de uitvoer uit de tweede en derde querysecties is verwijderd:

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

In een samenvoegquery van Access kunt u slechts één keer de volgorde instellen, maar u kunt elke query afzonderlijk filteren. U ziet hier een voorbeeld op basis van de samenvoegquery van de vorige sectie waarbij elke query is gefilterd door een WHERE-component toe te voegen.

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

Als u naar de gegevensbladweergave gaat, ziet u deze resultaten:

Dienstverband

Achternaam

Voornaam

Leverancier

Vanderstar

Lynn

Intern

Plant

Fenna

Klant

Schoonen

Arnaud

Intern

Roossien

Johanna

Leverancier

Rigter

Elize

Klant

Spel

Joep

Leverancier

Scholts

Pieter-Bas

Leverancier

Jobse

Enver

Intern

de Graaf

Jimmy

Leverancier

Zuidwijk

Jacobje

Intern

Veenhuizen

Ger

Als de query's die u wilt samenvoegen, nogal verschillen, kan het gebeuren dat er in een uitvoerveld gegevens met verschillende gegevenstypen moeten worden gecombineerd. Als dit het geval is, worden de resultaten met de samenvoegquery meestal geretourneerd als tekstgegevenstype omdat dit gegevenstype zoals tekst als getallen kan bevatten.

Om inzicht te krijgen in hoe dit werkt, gebruiken we de samenvoegquery Producttransacties in de Northwind-voorbeelddatabase. Open deze voorbeelddatabase en open de query Producttransacties in de gegevensbladweergave. De laatste tien records moeten ongeveer gelijk zijn aan deze uitvoer:

Product-id

Orderdatum

Bedrijfsnaam

Transactie

Hoeveelheid

77

22-1-2006

Leverancier B

Aankoop

60

80

22-1-2006

Leverancier D

Aankoop

75

81

22-1-2006

Leverancier A

Aankoop

125

81

22-1-2006

Leverancier A

Aankoop

200

7

20-1-2006

Bedrijf D

Verkoop

10

51

20-1-2006

Bedrijf D

Verkoop

10

80

20-1-2006

Bedrijf D

Verkoop

10

34

15-1-2006

Bedrijf AA

Verkoop

100

80

15-1-2006

Bedrijf AA

Verkoop

30

Stel dat u het veld Hoeveelheid wilt splitsen in twee velden: Kopen en Verkopen. We gaan er ook vanuit dat u een vaste nulwaarde wilt voor het veld zonder waarde. De SQL ziet er als volgt uit voor deze samenvoegquery:

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; 

Als u naar de gegevensbladweergave gaat, ziet u dat de laatste tien records nu als volgt worden weergegeven:

Product-id

Orderdatum

Bedrijfsnaam

Transactie

Kopen

Verkopen

74

22-1-2006

Leverancier B

Aankoop

20

0

77

22-1-2006

Leverancier B

Aankoop

60

0

80

22-1-2006

Leverancier D

Aankoop

75

0

81

22-1-2006

Leverancier A

Aankoop

125

0

81

22-1-2006

Leverancier A

Aankoop

200

0

7

20-1-2006

Bedrijf D

Verkoop

0

10

51

20-1-2006

Bedrijf D

Verkoop

0

10

80

20-1-2006

Bedrijf D

Verkoop

0

10

34

15-1-2006

Bedrijf AA

Verkoop

0

100

80

15-1-2006

Bedrijf AA

Verkoop

0

30

Maar als u in dit voorbeeld nu wilt dat de velden met een nul leeg zijn? U kunt de SQL zo aanpassen dat er niets wordt weergegeven in plaats van een nul door het trefwoord Null als volgt toe te voegen:

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;

Maar zoals u misschien hebt gezien toen u naar de gegevensbladweergave overschakelde, hebt u nu een onverwacht resultaat. In de kolom Kopen is elk veld gewist:

Product-id

Orderdatum

Bedrijfsnaam

Transactie

Kopen

Verkopen

74

22-1-2006

Leverancier B

Aankoop

 

 

77

22-1-2006

Leverancier B

Aankoop

 

 

80

22-1-2006

Leverancier D

Aankoop

 

 

81

22-1-2006

Leverancier A

Aankoop

 

 

81

22-1-2006

Leverancier A

Aankoop

 

 

7

20-1-2006

Bedrijf D

Verkoop

 

10

51

20-1-2006

Bedrijf D

Verkoop

 

10

80

20-1-2006

Bedrijf D

Verkoop

 

10

34

15-1-2006

Bedrijf AA

Verkoop

 

100

80

15-1-2006

Bedrijf AA

Verkoop

 

30

Dit komt omdat de gegevenstypen van de velden uit de eerste query door Access worden vastgesteld. In dit voorbeeld is Null geen getal.

Wat gebeurt er als u een lege tekenreeks wilt invoegen voor de lege waarde van velden? De SQL hiervoor kan er als volgt uitzien:

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;

Wanneer u naar de gegevensbladweergave gaat, ziet u dat in Access de waarden voor Kopen worden opgehaald, maar dat de waarden worden geconverteerd naar tekst. U kunt zien dat dit tekstwaarden zijn, omdat ze links zijn uitgelijnd in de gegevensbladweergave. De lege tekenreeks in de eerste query is geen getal en daarom ziet u deze resultaten. U ziet ook dat de waarden voor Verkopen worden geconverteerd naar tekst omdat de aankooprecords een lege tekenreeks bevatten.

Product-id

Orderdatum

Bedrijfsnaam

Transactie

Kopen

Verkopen

74

22-1-2006

Leverancier B

Aankoop

20

 

77

22-1-2006

Leverancier B

Aankoop

60

 

80

22-1-2006

Leverancier D

Aankoop

75

 

81

22-1-2006

Leverancier A

Aankoop

125

 

81

22-1-2006

Leverancier A

Aankoop

200

 

7

20-1-2006

Bedrijf D

Verkoop

 

10

51

20-1-2006

Bedrijf D

Verkoop

 

10

80

20-1-2006

Bedrijf D

Verkoop

 

10

34

15-1-2006

Bedrijf AA

Verkoop

 

100

80

15-1-2006

Bedrijf AA

Verkoop

 

30

Hoe lost u deze puzzel op?

Eén oplossing is om af te dwingen dat de query verwacht dat de veldwaarde een getal is. Dit kunt u doen met de expressie:

IIf(False, 0, Null)

De voorwaarde die moet worden gecontroleerd, Onwaar, is nooit Waar, dus wordt met de expressie altijd Null geretourneerd, maar in Access worden beide uitvoeropties nog steeds geëvalueerd en wordt bepaald of de uitvoer numeriek of Null is.

Hier ziet u hoe we deze expressie kunnen gebruiken in ons voorbeeld:

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;

U hoeft de tweede query niet te wijzigen.

Als u naar de gegevensbladweergave overschakelt, ziet u nu het gewenste resultaat:

Product-id

Orderdatum

Bedrijfsnaam

Transactie

Kopen

Verkopen

74

22-1-2006

Leverancier B

Aankoop

20

 

77

22-1-2006

Leverancier B

Aankoop

60

 

80

22-1-2006

Leverancier D

Aankoop

75

 

81

22-1-2006

Leverancier A

Aankoop

125

 

81

22-1-2006

Leverancier A

Aankoop

200

 

7

20-1-2006

Bedrijf D

Verkoop

 

10

51

20-1-2006

Bedrijf D

Verkoop

 

10

80

20-1-2006

Bedrijf D

Verkoop

 

10

34

15-1-2006

Bedrijf AA

Verkoop

 

100

80

15-1-2006

Bedrijf AA

Verkoop

 

30

U kunt hetzelfde resultaat behalen door de query's in de samenvoegquery vooraf te laten gaan door weer een andere query:

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

Voor elk veld worden vaste waarden geretourneerd van het gegevenstype dat u definieert. U wilt natuurlijk niet dat de uitvoer van deze query van invloed is op de resultaten. Dit kunt u voorkomen door een WHERE-component met Onwaar op te nemen:

WHERE False

Dit is een trucje omdat dit altijd onwaar is en er met de query zo niets wordt geretourneerd. Als u deze instructie combineert met de bestaande SQL, ziet de volledige instructie er als volgt uit:

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;

Opmerking: Met de gecombineerde query in dit voorbeeld met de Northwind-database worden 100 records geretourneerd, terwijl met de twee afzonderlijke query's 58 en 43 records worden geretourneerd voor een totaal van 101 records. De reden voor deze afwijking is dat er twee records niet uniek zijn. Zie de sectie Werken met unieke records in samenvoegquery's met UNION ALL voor meer informatie over het oplossen van dit scenario met UNION ALL.

Een speciaal gebruik van een samenvoegquery is het combineren van een set records met één record die de som van een of meer velden bevat.

Hier is nog een voorbeeld dat u in de Northwind-voorbeelddatabase kunt maken om te zien hoe u een totaal kunt verkrijgen in een samenvoegquery.

  1. Maak een nieuwe eenvoudige query om de aanschaf van bier (Product-id = 34 in de Northwind-database) te bekijken met de volgende SQL-syntaxis:

    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. Ga naar de gegevensbladweergave, waar u vier aankopen moet zien:

    Datum ontvangen

    Hoeveelheid

    22-1-2006

    100

    22-1-2006

    60

    4-4-2006

    50

    5-4-2006

    300

  3. Om het totaal te verkrijgen, maakt u een eenvoudige statistische query met de volgende SQL:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. Ga naar de gegevensbladweergave, waar u slechts één aankoop moet zien:

    MaxOfDate ontvangen

    SumOfQuantity

    5-4-2006

    510

  5. Combineer deze twee query's tot een samenvoegquery om de record met de totale hoeveelheid toe te voegen aan de aankooprecords:

    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. Ga naar de gegevensbladweergave, waar u de vier aankopen ziet met de som van elke aankoop, gevolgd door een record met de som van het aantal:

    Datum ontvangen

    Hoeveelheid

    22-1-2006

    60

    22-1-2006

    100

    4-4-2006

    50

    5-4-2006

    300

    5-4-2006

    510

Dit zijn de basisbeginselen van het toevoegen van totalen aan een samenvoegquery. U wilt mogelijk ook vaste waarden opnemen in beide query's, zoals Details en Totaal om de record met totalen visueel te onderscheiden van de andere records. Informatie over het gebruik van vaste waarden vindt u in de sectie Drie of meer tabellen of query's in een samenvoegquery combineren.

Samenvoegquery's in Access bevatten standaard alleen unieke records. Maar wat moet u doen als u alle records wilt opnemen? Dat kunt u zien in dit voorbeeld.

In de vorige sectie hebt u gezien hoe u een totaal kunt maken in een samenvoegquery. Wijzig de SQL van deze samenvoegquery om Product-id = 48 op te nemen:

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

Ga naar de gegevensbladweergave, waar u een enigszins misleidend resultaat ziet:

Datum ontvangen

Hoeveelheid

22-1-2006

100

22-1-2006

200

Met één record wordt natuurlijk niet twee keer de hoeveelheid bij totaal geretourneerd.

U ziet dit resultaat omdat op één dag dezelfde hoeveelheid bonbons twee keer is verkocht, zoals is vastgelegd in de tabel Inkooporderdetails. Dit is een eenvoudig selectiequeryresultaat waarin beide records in de Northwind-voorbeelddatabase worden weergegeven:

Inkooporder-id

Product

Hoeveelheid

100

Northwind Traders Chocolate

100

92

Northwind Traders Chocolate

100

In de samenvoegquery van eerder ziet u dat het veld Inkooporder-id niet is opgenomen en dat de twee velden niet twee unieke records zijn.

Als u alle records wilt opnemen, gebruikt u UNION ALL in plaats van UNION in uw SQL. Dit is waarschijnlijk van invloed op de sortering van de resultaten, dus is het handig om ook een ORDER BY-component op te nemen om de sorteervolgorde op te geven. Dit is de aangepaste SQL op basis van het vorige voorbeeld:

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

Als u naar de gegevensbladweergave gaat, ziet u alle details naast een totaal als laatste record:

Datum ontvangen

Totaal

Hoeveelheid

22-1-2006

 

100

22-1-2006

 

100

22-1-2006

Totaal

200

Een samenvoegquery wordt vaak gebruikt als recordbron voor een keuzelijst met invoervak in een formulier. U kunt deze keuzelijst met invoervak gebruiken om een waarde te selecteren waarop u de records in het formulier wilt filteren. U kunt bijvoorbeeld de werknemerrecords filteren op plaats.

U kunt zien hoe dit werkt in een ander voorbeeld dat u in de Northwind-voorbeelddatabase kunt maken om dit scenario te bekijken.

  1. Maak een eenvoudige selectiequery met deze SQL-syntaxis:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. Ga naar de gegevensbladweergave, waar u de volgende resultaten ziet:

    Plaats

    Filter

    Zwolle

    Amsterdam

    Alkmaar

    Alkmaar

    Den Helder

    Den Helder

    Haarlem

    Haarlem

    Zwolle

    Zwolle

    Den Helder

    Den Helder

    Zwolle

    Zwolle

    Den Helder

    Den Helder

    Zwolle

    Zwolle

  3. Als u naar deze resultaten kijkt, ziet u niet veel waarden. Breid de query uit en transformeer deze in een samenvoegquery met behulp van de volgende SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. Ga naar de gegevensbladweergave, waar u de volgende resultaten ziet:

    Plaats

    Filter

    <Alle>

    *

    Alkmaar

    Alkmaar

    Haarlem

    Haarlem

    Den Helder

    Den Helder

    Zwolle

    Zwolle

    In Access wordt een samenvoeging uitgevoerd van de negen records die eerder zijn weergegeven, met vaste veldwaarden van <Alle> en '*'.

    Omdat deze samenvoegcomponent niet UNION ALL bevat, worden alleen unieke records geretourneerd. Dit betekent dat elke plaats slechts één keer wordt geretourneerd met vaste identieke waarden.

  5. Nu u een voltooide samenvoegquery hebt waarmee elke plaatsnaam slechts één keer wordt weergegeven, samen met een optie waarmee alle plaatsen worden geselecteerd, kunt u deze query gebruiken als recordbron voor een keuzelijst met invoervak in een formulier. Als u dit specifieke voorbeeld gebruikt als model, kunt u een keuzelijst met invoervak maken in een formulier, deze query instellen als de recordbron, de eigenschap Kolombreedte van de kolom Filter instellen op 0 (nul) om deze te verbergen en de eigenschap Afhankelijke kolom instellen op 1 om de index van de tweede kolom aan te geven. In de eigenschap Filter van het formulier zelf kunt u vervolgens code zoals de volgende toevoegen om een formulierfilter te activeren met de waarde van het geselecteerde item in de keuzelijst met invoervak:

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

    De gebruiker van het formulier kan de formulierrecords daarna filteren op een specifieke plaatsnaam of <Alle> selecteren om alle records voor alle plaatsen weer te geven.

Naar boven

Uw Office-vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Office Insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagents.

×