Använda en unionsfråga för att kombinera flera frågor till ett resultat

Använda en unionsfråga för att kombinera flera frågor till ett resultat

Ibland kanske du vill visa poster från en tabell eller fråga tillsammans med poster från en eller flera andra tabeller och skapa en uppsättning poster – en lista med alla poster från två eller flera tabeller. Det gör du med en unionsfråga i Access.

För att verkligen förstå unionsfrågor bör du först veta hur du skapar grundläggande urvalsfrågor i Access. Mer information om hur du utformar urvalsfrågor finns i Skapa en enkel urvalsfråga.

Obs!: Den här artikelns innehåll är avsett för stationära Access-databaser. Det går inte att skapa eller använda unionsfrågor i Access-webbdatabaser eller Access-webbappar.

Se ett exempel på hur en unionsfråga fungerar

Om du aldrig har skapat en unionsfråga tidigare kan det vara användbart att först se ett exempel på hur det kan fungera i Access-mallen för Northwind. Du kan söka efter Northwind-exempelmallen på sidan Komma igång med Access genom att klicka på Arkiv > Nytt eller så kan du ladda ned en kopia direkt här: Northwind-exempelmall.

När Northwind-databasen har öppnats i Access ska du stänga formuläret för inloggningsdialogrutan som först visas och sedan expandera navigeringsfönstret. Klicka längst upp i navigeringsfönstret och välj sedan Objekttyp för att ordna alla databasobjekt efter typ. Därefter expanderar du gruppen Frågor. Då ser du en fråga som kallas Produkttransaktioner.

Det är enkelt att skilja unionsfrågor från andra frågeobjekt eftersom de har en särskild ikon som liknar två sammanflätade cirklar som representerar en förenad uppsättning av två uppsättningar:

Skärmbild av en unionsfrågeikon i Access.

Till skillnad från normala urvals- och redigeringsfrågor är tabellerna inte relaterade i en unionsfråga, vilket innebär att Access grafiska frågedesigner inte kan användas för att skapa eller redigera unionsfrågor. Du kommer att märka detta om du öppnar en unionsfråga i navigeringsfönstret. Den öppnas i Access och resultatet visas i databladsvyn. Under kommandot Vyer på fliken Start ser du att Designvy inte är tillgänglig när du arbetar med unionsfrågor. Du kan bara byta mellan Databladsvy och SQL-vy när du arbetar med unionsfrågor.

Om du vill fortsätta att utforska det här exemplet på unionsfråga klickar du på Start > Vyer > SQL-vy för att visa SQL-syntaxen som definierar den. I den här illustrationen har vi lagt till några extra mellanrum i SQL-vyn så att du enkelt kan se de olika delarna som utgör en unionsfråga.

Din webbläsare har inte stöd för video. Installera Microsoft Silverlight, Adobe Flash Player eller Internet Explorer 9.

Nu ska vi titta på SQL-syntaxen i den här unionsfrågan från Northwind-databasen i detalj:

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;

Den första och tredje delen av det här SQL-uttrycket är i princip två urvalsfrågor. Dessa frågor hämtar två olika uppsättningar poster: en från tabellen Produktorder och en från tabellen Produktinköp.

Den andra delen av det här SQL-uttrycket är nyckelordet UNION, som anger i Access att den här frågan kombinerar dessa två uppsättningar poster.

Den sista delen av det här SQL-uttrycket avgör ordningen för de kombinerade posterna med hjälp av ett ORDER BY-uttryck. I det här exemplet ordnar Access alla poster efter fältet Orderdatum i fallande ordning.

Obs!: Unionsfrågor är alltid skrivskyddade i Access. Du kan inte ändra några värden i databladsvyn.

Skapa en unionsfråga genom att skapa och kombinera urvalsfrågor

Även om du kan skapa en unionsfråga genom att direkt skriva SQL-syntaxen i SQL-vyn, kan det vara enklare att skapa den i delar med urvalsfrågor. Du kan sedan kopiera och klistra in SQL-delarna i en kombinerad unionsfråga.

Om du inte vill läsa anvisningarna och i stället titta på ett exempel kan du gå till nästa avsnitt, Se ett exempel på att skapa en unionsfråga.

  1. Klicka på Frågedesign i gruppen Frågor på fliken Skapa.

  2. Dubbelklicka på tabellen som innehåller fälten som du vill inkludera i dialogrutan Visa tabell. Tabellen läggs till i frågedesignfönstret.

  3. Stäng dialogrutan Visa tabell.

  4. Dubbelklicka på varje fält som du vill ta med i frågedesignfönstret. När du markerar fälten ska du se till att lägga till samma antal fält, i samma ordning, som du lägger till andra urvalsfrågor. Var uppmärksam på fältens datatyper och kontrollera att de har datatyper som är kompatibla med fält i samma position i de övriga frågorna du kombinerar. Om den första markerade frågan exempelvis har fem fält där den första innehåller datum-/tidsdata, ska du säkerställa att var och en av de övriga frågorna du kombinerar också har fem fält, där den första innehåller datum-/tidsdata osv.

  5. Du kan även lägga till villkor för fälten genom att skriva in lämpliga uttryck på raden för Villkor i rutnätet.

  6. När du har lagt till fält och fältvillkor bör du köra urvalsfrågan och granska dess utdata. Gå till fliken Design, gruppen Resultat och klicka på Kör.

  7. Växla frågan till designvyn.

  8. Spara Select-frågan och lämna den öppen.

  9. Upprepa den här proceduren för var och en av de Select-frågor du vill kombinera.

Nu när du har skapat dina urvalsfrågor är det dags att kombinera dem. I det här steget skapar du unionsfrågan genom att kopiera och klistra in SQL-uttryck.

  1. Klicka på Frågedesign i gruppen Frågor på fliken Skapa.

  2. Stäng dialogrutan Visa tabell.

  3. Gå till fliken Design, gruppen Fråga och klicka på Union. Access döljer frågedesignfönstret och visar SQL-vyns objektflik. I det här läget är SQL-vyns objektflik tom.

  4. Klicka på fliken för den första Select-frågan du vill kombinera i unionsfrågan.

  5. Gå till fliken Start och klicka på Visa > SQL-vy.

  6. Kopiera SQL-uttrycket för Select-frågan. Klicka på fliken för unionsfrågan som du började skapa tidigare.

  7. Klistra in SQL-uttrycket för Select-frågan på unionsfrågans objektflik för SQL-vyn.

  8. Ta bort semikolonet (;) som ligger i slutet av Select-frågans SQL-uttryck.

  9. Tryck på Retur för att flytta ned markören en rad och skriv sedan UNION på den nya raden.

  10. Klicka på fliken för nästa Select-fråga som du vill kombinera i unionsfrågan.

  11. Upprepa steg 5 till 10 för den här proceduren tills du har kopierat och klistrat in alla SQL-uttryck för Select-frågor i SQL-vyn för unionsfrågan. Ta inte bort semikolon eller skriv något efter SQL-uttrycket för den senaste Select-frågan.

  12. Klicka på Kör i gruppen Resultat på fliken Design.

Resultaten av unionsfrågan visas i databladsvyn.

Se ett exempel på att skapa en unionsfråga

Här är ett exempel som du kan återskapa i Northwind-exempeldatabasen. Den här unionsfrågan samlar in namnen på personer från tabellen Kunder och kombinerar dem med namnen på personer från tabellen Leverantörer. Om du vill följa med själv kan du gå igenom stegen i ditt exemplar av Northwind-exempeldatabasen.

Din webbläsare har inte stöd för video. Installera Microsoft Silverlight, Adobe Flash Player eller Internet Explorer 9.

De här stegen är nödvändiga för att skapa det här exemplet:

  1. Skapa två urvalsfrågor som kallas Fråga1 och Fråga2 med tabellerna Kunder respektive Leverantörer som datakällor. Använd fälten Förnamn och Efternamn som visningsvärden.

  2. Skapa en ny fråga som kallas Fråga3 utan datakälla till en början och klicka sedan på kommandot Union på fliken Design för att göra den här frågan till en unionsfråga.

  3. Kopiera och klistra in SQL-uttrycken från Fråga1 och Fråga2 till Fråga3. Se till att ta bort det extra semikolonet och lägg till nyckelordet UNION. Du kan sedan kontrollera resultaten i databladsvyn.

  4. Lägg till en ordningssats i någon av frågorna och klistra sedan in ORDER BY-uttrycket i unionsfrågans SQL-vy. Lägg märke till följande i Fråga3, unionsfrågan: När ordningen håller på att läggas till tas först semikolonen bort, och sedan tabellnamnet från fältnamnen.

  5. Den slutliga SQL-syntaxen som kombinerar och sorterar namnen för det här exemplet på en unionsfråga är följande:

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

Om du är helt bekväm med att skriva SQL-syntax kan du skriva ett eget SQL-uttryck för unionsfrågan direkt i SQL-vyn. Men kan det vara användbart att följa metoden att kopiera och klistra in SQL från andra frågeobjekt. Varje fråga kan vara mycket mer komplicerad än de enkla urvalsfrågeexempel som används här. Det kan vara bra att skapa och testa varje fråga noggrant innan du kombinerar dem i en unionsfråga. Om unionsfrågan inte kan köras kan du justera varje fråga individuellt tills det går och sedan återskapa din unionsfråga med den korrigerade syntaxen.

Läs de återstående avsnitten i den här artikeln om du vill ha fler tips om hur du använder unionsfrågor.

I exemplet i det föregående avsnittet med Northwind-databasen kombineras bara data från två tabeller. Du kan dock enkelt kombinera tre eller fler tabeller i en unionsfråga. Till exempel kanske du vill bygga vidare på föregående exempel och även inkludera namnen på de anställda i frågeresultatet. Du kan utföra uppgiften genom att lägga till en tredje fråga och kombinera med det föregående SQL-uttrycket med ett ytterligare UNION-nyckelord så här:

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

När du visar resultatet i databladsvyn visas alla anställda med exempelföretagsnamnet, vilket förmodligen inte är så användbart. Om du vill att fältet ska ange om en person är en intern anställd, från en leverantör eller från en kund kan du inkludera ett fast värde i stället för företagsnamnet. Så här bör SQL-syntaxen se ut:

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

Så här visas resultatet i vyn Datablad. Access visar följande fem exempelposter:

Anställning

Efternamn

Förnamn

Interna

Freehafer

Nancy

Interna

Giussani

Laura

Leverantör

Glasson

Stuart

Kund

Goldschmidt

Daniel

Kund

Gratacos Solsona

Antonio

Frågan ovan kan reduceras ytterligare eftersom Access bara läser namnen i utdatafälten för den första frågan i en unionsfråga. Här ser du att vi har tagit bort utdata från det andra och tredje frågeavsnittet:

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

Ordningen kan endast ändras en gång i en unionsfråga i Access men varje fråga kan filtreras individuellt. Med utgångspunkt i föregående avsnitts unionsfråga visas här är ett exempel där vi har filtrerat varje fråga genom att lägga till en WHERE-sats.

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

Växla till databladsvyn så visas resultatet ungefär så här:

Anställning

Efternamn

Förnamn

Leverantör

Andersen

Elizabeth A.

Interna

Freehafer

Nancy

Kund

Hasselberg

Jonas

Interna

Hellung-Larsen

Anne

Leverantör

Hernandez Echevarria

Amaya

Kund

Mortensen

Sven

Leverantör

Sandberg

Mikael

Leverantör

Sabzevari

Hanif

Interna

Thorpe

Steven

Leverantör

Weiler

Cornelia

Interna

Zare

Robert

Om frågorna som ska samordnas till unionsfrågor är mycket olika kan det uppstå en situation där ett utdatafält måste kombinera data av olika datatyper. Om så är fallet returnerar unionsfrågan oftast resultaten som en textdatatyp eftersom den datatypen kan innehålla både text och tal.

För att visa hur detta fungerar använder vi unionsfrågan Produkttransaktioner i Northwind-exempeldatabasen. Öppna exempeldatabasen och öppna sedan frågan Produkttransaktioner i databladsvyn. De sista tio posterna bör se ut ungefär så här:

Produkt-ID

Orderdatum

Företagsnamn

Transaktion

Antal

77

2006-01-22

Leverantör B

Köp

60

80

2006-01-22

Leverantör D

Köp

75

81

2006-01-22

Leverantör A

Köp

125

81

2006-01-22

Leverantör A

Köp

200

7

2006-01-20

Företag D

Försäljning

10

51

2006-01-20

Företag D

Försäljning

10

80

2006-01-20

Företag D

Försäljning

10

34

2006-01-15

Företag AA

Försäljning

100

80

2006-01-15

Företag AA

Försäljning

30

Vi antar att du vill dela fältet Antal i två – Köp och Försäljning. Låt oss också anta att du vill ha ett fast nollvärde för fältet utan något värde. Så här kommer SQL-syntaxen att se ut för den här unionsfrågan:

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; 

Om du växlar till databladsvyn visas de sista tio posterna så här:

Produkt-ID

Orderdatum

Företagsnamn

Transaktion

Köp

Försäljning

74

2006-01-22

Leverantör B

Köp

20

0

77

2006-01-22

Leverantör B

Köp

60

0

80

2006-01-22

Leverantör D

Köp

75

0

81

2006-01-22

Leverantör A

Köp

125

0

81

2006-01-22

Leverantör A

Köp

200

0

7

2006-01-20

Företag D

Försäljning

0

10

51

2006-01-20

Företag D

Försäljning

0

10

80

2006-01-20

Företag D

Försäljning

0

10

34

2006-01-15

Företag AA

Försäljning

0

100

80

2006-01-15

Företag AA

Försäljning

0

30

Vi fortsätter med det här exemplet. Hur blir det om du vill att fälten med noll ska vara tomma? Du kan ändra SQL-syntaxen för att visa ingenting i stället för noll genom att lägga till nyckelordet Null så här:

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;

Men som du kanske har sett när du växlar till databladsvyn har du nu fått ett oväntat resultat. Alla fält är tomma i kolumnen Köp:

Produkt-ID

Orderdatum

Företagsnamn

Transaktion

Köp

Försäljning

74

2006-01-22

Leverantör B

Köp

 

 

77

2006-01-22

Leverantör B

Köp

 

 

80

2006-01-22

Leverantör D

Köp

 

 

81

2006-01-22

Leverantör A

Köp

 

 

81

2006-01-22

Leverantör A

Köp

 

 

7

2006-01-20

Företag D

Försäljning

 

10

51

2006-01-20

Företag D

Försäljning

 

10

80

2006-01-20

Företag D

Försäljning

 

10

34

2006-01-15

Företag AA

Försäljning

 

100

80

2006-01-15

Företag AA

Försäljning

 

30

Orsaken till att detta händer är att Access avgör datatyperna för fält utifrån den första frågan. I det här exemplet är Null inte ett tal.

Vad händer om du försöker infoga en tom sträng för det tomma värdet i fälten? SQL för det här försöket kan se ut så här:

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;

När du växlar till databladsvyn ser du att Access hämtar Köp-värden, men värdena konverteras till text. Du ser att dessa är textvärden eftersom de är vänsterjusterade i databladsvyn. Den tomma strängen i första frågan är inte ett tal, det är därför du får det här resultatet. Du ser också att värdena för Försäljning också konverterats till text eftersom köpposterna innehåller en tom sträng.

Produkt-ID

Orderdatum

Företagsnamn

Transaktion

Köp

Försäljning

74

2006-01-22

Leverantör B

Köp

20

 

77

2006-01-22

Leverantör B

Köp

60

 

80

2006-01-22

Leverantör D

Köp

75

 

81

2006-01-22

Leverantör A

Köp

125

 

81

2006-01-22

Leverantör A

Köp

200

 

7

2006-01-20

Företag D

Försäljning

 

10

51

2006-01-20

Företag D

Försäljning

 

10

80

2006-01-20

Företag D

Försäljning

 

10

34

2006-01-15

Företag AA

Försäljning

 

100

80

2006-01-15

Företag AA

Försäljning

 

30

Hur löser du problemet?

En lösning är att tvinga frågan att förvänta att fältvärdet ska vara ett tal. Det kan uppnås med uttrycket:

IIf(False, 0, Null)

Villkoret att kontrollera, Falskt, kommer aldrig att bli Sant, därav returnerar uttrycket alltid Null, men Access utvärderar ändå båda utdataalternativen och bestämmer om resultatet ska vara numeriskt eller Null.

Så här kan vi använda det här uttrycket i vårt arbetsexempel:

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;

Observera att det inte är nödvändigt att ändra den andra frågan.

Om du växlar till databladsvyn ser du nu ett resultat som vi vill ha:

Produkt-ID

Orderdatum

Företagsnamn

Transaktion

Köp

Försäljning

74

2006-01-22

Leverantör B

Köp

20

 

77

2006-01-22

Leverantör B

Köp

60

 

80

2006-01-22

Leverantör D

Köp

75

 

81

2006-01-22

Leverantör A

Köp

125

 

81

2006-01-22

Leverantör A

Köp

200

 

7

2006-01-20

Företag D

Försäljning

 

10

51

2006-01-20

Företag D

Försäljning

 

10

80

2006-01-20

Företag D

Försäljning

 

10

34

2006-01-15

Företag AA

Försäljning

 

100

80

2006-01-15

Företag AA

Försäljning

 

30

Ett annat sätt att uppnå samma resultat är att infoga frågorna i unionsfrågan med en annan fråga:

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

För varje fält returnerar Access fasta värden av den datatyp som du definierar. Självklart vill du inte att utdata för den här frågan stör resultatet. För att undvika det ska du inkludera en WHERE-sats med värdet Falskt:

WHERE False

Det är ett trick eftersom det alltid är falskt och då returnerar frågan ingenting. Om vi kombinerar det här uttrycket med befintlig SQL får vi ett slutligt uttryck enligt följande:

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;

Obs!: Den kombinerade frågan i det här exemplet i Northwind-databasen returnerar 100 poster, medan de två enskilda frågorna returnerar 58 och 43 poster, sammanlagt 101 poster. Anledningen till den här avvikelsen är att två poster inte är unika. Läs avsnittet Arbeta med unika poster i unionsfrågor med hjälp av UNION ALL om hur du löser det här scenariot med hjälp av UNION ALL.

Ett specialfall för en unionsfråga är att kombinera en uppsättning poster med en post som innehåller summan av ett eller flera fält.

Här är ett annat exempel som du kan skapa i Northwind-exempeldatabasen för att illustrera hur du får en totalsumma i en unionsfråga.

  1. Skapa en ny enkel fråga för att visa köp av öl (Produkt-ID=34 i Northwind-databasen) med hjälp av följande SQL-syntax:

    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. När du växlar till databladsvyn bör du se fyra köp:

    Mottaget den

    Antal

    2006-01-22

    100

    2006-01-22

    60

    2006-04-04

    50

    2006-04-05

    300

  3. Du får totalsumman genom att skapa en enkel sammanställningsfråga med hjälp av följande SQL:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. När du växlar till databladsvyn bör du endast se en post:

    MaxOfDate Received

    SumOfQuantity

    2006-04-05

    510

  5. Kombinera följande två frågor i en unionsfråga för att lägga till posten med totalt antal för köpposterna:

    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. När du växlar till databladsvyn bör du se de fyra köpen med summan för varje följt av en post som summerar antalet:

    Mottaget den

    Antal

    2006-01-22

    60

    2006-01-22

    100

    2006-04-04

    50

    2006-04-05

    300

    2006-04-05

    510

Det var allt om grunderna för att lägga till summor i en unionsfråga. Du kanske också vill inkludera fasta värden i båda frågorna, till exempel ”Detaljer” och ”Summa”, för att visuellt separera summaposten från de andra posterna. Du kan läsa om att använda fasta värden i avsnittet Kombinera tre eller fler tabeller eller frågor i en unionsfråga.

Unionsfrågor i Access inkluderar som standard endast unika poster. Men vad händer om du vill ta med alla poster? Ett annat exempel kan vara användbart här.

I föregående avsnitt visade vi hur du skapar en totalsumma i en unionsfråga. Ändra den unionsfrågans SQL så att den inkluderar Produkt-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];

När du växlar till databladsvyn bör du se ett något vilseledande resultat:

Mottaget den

Antal

2006-01-22

100

2006-01-22

200

En post returnerar förstås inte två gånger kvantiteten totalt.

Orsaken till att du ser det här resultatet är att en dag såldes samma kvantitet choklad två gånger – vilket registrerades i tabellen Inköpsorderdetaljer. Här är resultatet av en enkel urvalsfråga som visar båda posterna i Northwind-exempeldatabasen:

Inköpsorder-ID

Produkt

Antal

100

Northwind Traders Chocolate

100

92

Northwind Traders Chocolate

100

I unionsfrågan som angavs tidigare ser du att fältet Inköpsorder-ID inte finns med och att de två fälten inte är två unika poster.

Om du vill inkludera alla poster kan använda UNION ALL i stället för UNION i SQL. Detta har sannolikt en påverkan på sorteringen av resultatet, så du kanske även vill inkludera en ORDER BY-sats för att bestämma en sorteringsordning. Här visas den ändrade SQL:en som bygger på föregående exempel:

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

När du växlar till databladsvyn bör du se alla detaljer förutom en summa som den sista posten:

Mottaget den

Summa

Antal

2006-01-22

 

100

2006-01-22

 

100

2006-01-22

Summa

200

En vanlig användning för en unionsfråga är att fungera som datakälla för en kombinationsrutekontroll i ett formulär. Du kan använda den kombinationsrutan för att välja ett värde för att filtrera posterna i formuläret. Du kan till exempel filtrera poster för anställda efter ort.

För att visa hur det kan fungera visar vi här ett annat exempel som du kan skapa i Northwind-exempeldatabasen för att illustrera scenariot.

  1. Skapa en enkel urvalsfråga med hjälp av denna SQL-syntax:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. När du växlar till databladsvyn bör du se följande resultat:

    Ort

    Filter

    Seattle

    Seattle

    Bellevue

    Bellevue

    Redmond

    Redmond

    Kirkland

    Kirkland

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

  3. När du tittar på resultaten kanske du inte ser mycket värde. Men du kan expandera frågan och omvandla den till en unionsfråga med hjälp av följande SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. När du växlar till databladsvyn bör du se följande resultat:

    Ort

    Filter

    <Alla>

    *

    Bellevue

    Bellevue

    Kirkland

    Kirkland

    Redmond

    Redmond

    Seattle

    Seattle

    Access skapar en union av de nio posterna, som tidigare visats, med de fasta fältvärdena <Alla> och ”*”.

    Eftersom den här unionssatsen inte innehåller UNION ALL returnerar Access endast unika poster vilket innebär att varje ort bara returneras en gång med fasta identiska värden.

  5. Nu när du har en slutförd unionsfråga som visar varje ortsnamn bara en gång, tillsammans med ett alternativ som effektivt väljer ut alla orter, kan du använda den här frågan som datakälla för en kombinationsruta i ett formulär. Med det här specifika exemplet som en modell kan du skapa en kombinationsrutekontroll i ett formulär, ange den här frågan som dess datakälla, ange egenskapen Kolumnbredd för kolumnen Filter till 0 (noll) för att dölja den visuellt och sedan ange egenskapen Bunden kolumn till 1 för att ange indexet i den andra kolumnen. I egenskapen Filter i själva formuläret kan du sedan lägga till kod enligt följande för att aktivera ett formulärfilter med hjälp av värdet för vad som är markerat i kombinationsrutekontrollen:

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

    Användare av formuläret kan sedan filtrera formulärets poster efter ett visst ortsnamn eller välja <Alla> för att visa alla poster för alla orter.

Överst på sidan

Utöka dina Office-kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Office Insiders

Hade du nytta av den här informationen?

Tack för din feedback!

Tack för din feedback! Det låter som att det kan vara bra att koppla dig till en av våra Office-supportrepresentanter.

×