Verwenden Sie eine Union-Abfrage, um mehrere Abfragen zu einem einzigen Ergebnis zu kombinieren
Manchmal möchten Sie vielleicht die Datensätze aus einer Tabelle auflisten oder mit denen aus einer oder mehreren anderen Tabellen abfragen, um einen Satz von Datensätzen zu bilden – eine Liste mit allen Datensätzen aus zwei oder mehr Tabellen. Dies ist der Zweck einer Union-Abfrage in Access.
Um Vereinigungsabfragen effektiv zu verstehen, sollten Sie sich zunächst mit dem Entwerfen grundlegender Auswahlabfragen in Access vertraut machen. Weitere Informationen zum Entwerfen von Auswahlabfragen finden Sie unter Erstellen einer einfachen Auswahlabfrage .
Hinweis: Der Inhalt dieses Artikels ist für die Verwendung mit Access-Desktopdatenbanken vorgesehen. Sie können keine Union-Abfrage in Access-Webdatenbanken oder Access-Web-Apps erstellen oder verwenden.
Studieren Sie ein Beispiel für eine Arbeitsgruppenabfrage
Wenn Sie noch nie eine Union-Abfrage erstellt haben, ist es möglicherweise hilfreich, zunächst ein funktionierendes Beispiel in der Northwind Access-Vorlage zu studieren. Sie können auf der Seite „Erste Schritte" von Access nach der Northwind-Beispielvorlage suchen, indem Sie auf Datei > Neu klicken, oder Sie können direkt eine Kopie von diesem Speicherort herunterladen: Northwind-Beispielvorlage .
Nachdem Access die Northwind-Datenbank geöffnet hat, schließen Sie das Anmeldedialogfeld, das zuerst angezeigt wird, und erweitern Sie dann den Navigationsbereich. Klicken Sie auf den oberen Rand des Navigationsbereichs und wählen Sie dann Objekttyp aus, um alle Datenbankobjekte nach ihrem Typ zu organisieren. Erweitern Sie als Nächstes die Gruppe Abfragen und Sie sehen eine Abfrage namens Produkttransaktionen .
Union-Abfragen sind leicht von anderen Abfrageobjekten zu unterscheiden, da sie ein spezielles Symbol haben, das zwei verschlungenen Kreisen ähnelt, die eine vereinte Menge aus zwei Mengen darstellen:
Im Gegensatz zu normalen Auswahl- und Aktionsabfragen stehen Tabellen in einer Union-Abfrage nicht in Beziehung, was bedeutet, dass der grafische Abfrage-Designer von Access nicht zum Erstellen oder Bearbeiten von Union-Abfragen verwendet werden kann. Sie werden dies erleben, wenn Sie eine Vereinigungsabfrage aus dem Navigationsbereich öffnen; Access öffnet es und zeigt die Ergebnisse in der Datenblattansicht an. Unter dem Befehl „ Ansichten " auf der Registerkarte „ Startseite " werden Sie feststellen, dass die Entwurfsansicht nicht verfügbar ist, wenn Sie mit Vereinigungsabfragen arbeiten. Sie können nur zwischen der Datenblattansicht und der SQL-Ansicht wechseln, wenn Sie mit Union-Abfragen arbeiten.
Um Ihr Studium dieses Union- Abfragebeispiels fortzusetzen, klicken Sie auf Start > Ansichten > SQL-Ansicht , um die SQL-Syntax anzuzeigen, die sie definiert. In dieser Abbildung haben wir einige zusätzliche Leerzeichen in der SQL hinzugefügt, damit Sie die verschiedenen Teile, aus denen eine Union-Abfrage besteht, leicht erkennen können.
Sehen wir uns die SQL-Syntax dieser Union-Abfrage aus der Northwind-Datenbank im Detail an:
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;
Der erste und der dritte Teil dieser SQL-Anweisung sind im Wesentlichen zwei ausgewählte Abfragen. Diese Abfragen rufen zwei verschiedene Sätze von Datensätzen ab; eine aus der Tabelle „Produktbestellungen" und eine aus der Tabelle „Produktkäufe" .
Der zweite Teil dieser SQL-Anweisung ist das UNION- Schlüsselwort, das Access mitteilt, dass diese Abfrage diese beiden Datensätze kombinieren wird.
Der letzte Teil dieser SQL-Anweisung bestimmt die Reihenfolge der kombinierten Datensätze mithilfe einer ORDER BY -Anweisung. In diesem Beispiel sortiert Access alle Datensätze nach dem Feld „Bestelldatum" in absteigender Reihenfolge.
Hinweis: Union-Abfragen sind in Access immer schreibgeschützt; Sie können keine Werte in der Datenblattansicht ändern.
Erstellen Sie eine Union-Abfrage, indem Sie ausgewählte Abfragen erstellen und kombinieren
Auch wenn Sie eine Union-Abfrage erstellen können, indem Sie die SQL-Syntax direkt in die SQL-Ansicht schreiben, finden Sie es möglicherweise einfacher, sie in Teilen mit ausgewählten Abfragen zu erstellen. Anschließend können Sie die SQL-Teile kopieren und in eine kombinierte Union-Abfrage einfügen.
Wenn Sie das Lesen der Schritte überspringen und sich stattdessen ein Beispiel ansehen möchten, lesen Sie den nächsten Abschnitt, Sehen Sie sich ein Beispiel zum Erstellen einer Union-Abfrage an .
Klicken Sie auf der Registerkarte Erstellen in der Gruppe Abfragen auf Abfrageentwurf .
Doppelklicken Sie auf die Tabelle mit den einzuschließenden Feldern. Die Tabelle wird dem Abfrageentwurfsfenster hinzugefügt.
Doppelklicken Sie im Abfrageentwurfsfenster auf alle Felder, die Sie einbeziehen möchten. Stellen Sie beim Auswählen von Feldern sicher, dass Sie dieselbe Anzahl von Feldern in derselben Reihenfolge hinzufügen, die Sie den anderen ausgewählten Abfragen hinzufügen. Achten Sie sorgfältig auf die Datentypen der Felder und stellen Sie sicher, dass sie kompatible Datentypen mit Feldern an derselben Position in den anderen Abfragen haben, die Sie kombinieren. Wenn Ihre erste Auswahlabfrage beispielsweise fünf Felder hat, von denen das erste Datums-/Uhrzeitdaten enthält, stellen Sie sicher, dass jede der anderen Auswahlabfragen, die Sie kombinieren, ebenfalls fünf Felder hat, von denen das erste Datums-/Uhrzeitdaten enthält. usw.
Fügen Sie Ihren Feldern optional Kriterien hinzu, indem Sie die entsprechenden Ausdrücke in die Zeile Kriterien des Feldrasters eingeben.
Nachdem Sie das Hinzufügen von Feldern und Feldkriterien abgeschlossen haben, sollten Sie die Auswahlabfrage ausführen und ihre Ausgabe überprüfen. Klicken Sie auf der Registerkarte Entwurf in der Gruppe Ergebnisse auf Ausführen .
Wechseln Sie die Abfrage in die Entwurfsansicht.
Speichern Sie die Auswahlabfrage und lassen Sie sie geöffnet.
Wiederholen Sie diesen Vorgang für jede der ausgewählten Abfragen, die Sie kombinieren möchten.
Nachdem Sie nun Ihre ausgewählten Abfragen erstellt haben, ist es an der Zeit, sie zu kombinieren. In diesem Schritt erstellen Sie die Union-Abfrage, indem Sie die SQL-Anweisungen kopieren und einfügen.
Klicken Sie auf der Registerkarte Erstellen in der Gruppe Abfragen auf Abfrageentwurf .
Klicken Sie auf der Registerkarte Design in der Gruppe Abfrage auf Union . Access blendet das Abfrageentwurfsfenster aus und zeigt die Objektregisterkarte der SQL-Ansicht an. Zu diesem Zeitpunkt ist die Objektregisterkarte der SQL-Ansicht leer.
Klicken Sie auf die Registerkarte für die erste Auswahlabfrage, die Sie in der Vereinigungsabfrage kombinieren möchten.
Klicken Sie auf der Registerkarte Start auf Ansicht > SQL-Ansicht .
Kopieren Sie die SQL-Anweisung für die Auswahlabfrage. Klicken Sie auf die Registerkarte für die Union-Abfrage, die Sie zuvor erstellt haben.
Fügen Sie die SQL-Anweisung für die Auswahlabfrage in die Registerkarte „SQL-Ansichtsobjekt" der Union-Abfrage ein.
Löschen Sie das Semikolon (;) am Ende der Select-Query-SQL-Anweisung.
Drücken Sie die Eingabetaste, um den Cursor eine Zeile nach unten zu bewegen, und geben Sie dann UNION in die neue Zeile ein.
Klicken Sie auf die Registerkarte für die nächste Auswahlabfrage, die Sie in der Vereinigungsabfrage kombinieren möchten.
Wiederholen Sie die Schritte 5 bis 10, bis Sie alle SQL-Anweisungen für die ausgewählten Abfragen kopiert und in das SQL-Ansichtsfenster der Union-Abfrage eingefügt haben. Löschen Sie nicht das Semikolon und geben Sie nichts nach der SQL-Anweisung für die letzte Auswahlabfrage ein.
Klicken Sie auf der Registerkarte Entwurf in der Gruppe Ergebnisse auf Ausführen .
Die Ergebnisse Ihrer Union-Abfrage werden in der Datenblattansicht angezeigt.
Sehen Sie sich ein Beispiel zum Erstellen einer Union-Abfrage an
Hier ist ein Beispiel, das Sie in der Northwind-Beispieldatenbank neu erstellen können. Diese Union-Abfrage sammelt die Namen von Personen aus der Customers -Tabelle und kombiniert sie mit den Namen von Personen aus der Suppliers -Tabelle. Wenn Sie mitmachen möchten, arbeiten Sie diese Schritte in Ihrer Kopie der Northwind-Beispieldatenbank durch.
Hier sind die Schritte, die zum Erstellen dieses Beispiels erforderlich sind:
Erstellen Sie zwei ausgewählte Abfragen namens Abfrage1 und Abfrage2 mit den Tabellen „Kunden" bzw. „Lieferanten" als Datenquellen. Verwenden Sie die Felder „Vorname" und „Nachname" als Anzeigewerte.
Erstellen Sie zunächst eine neue Abfrage mit dem Namen „Query3" ohne Datenquelle und klicken Sie dann auf den Befehl „ Union " auf der Registerkarte „ Entwurf ", um diese Abfrage in eine Union-Abfrage umzuwandeln.
Kopieren Sie die SQL-Anweisungen aus Abfrage1 und Abfrage2 und fügen Sie sie in Abfrage3 ein. Achten Sie darauf, das zusätzliche Semikolon zu entfernen und das Schlüsselwort UNION hinzuzufügen. Anschließend können Sie Ihre Ergebnisse in der Datenblattansicht überprüfen.
Fügen Sie eine Sortierklausel in eine der Abfragen ein und fügen Sie dann die Anweisung ORDER BY in die SQL-Ansicht der Union-Abfrage ein. Beachten Sie, dass in Query3, der Union-Abfrage, wenn die Sortierung angehängt werden soll, zuerst die Semikolons entfernt werden, dann der Tabellenname aus den Feldnamen.
Die letzte SQL, die die Namen für dieses Union-Abfragebeispiel kombiniert und sortiert, lautet wie folgt:
WÄHLEN Sie Kunden.Firma, Kunden.[Nachname], Kunden.[Vorname] VON Kunden UNION SELECT Suppliers.Company, Suppliers.[Nachname], Suppliers.[Vorname] VON Lieferanten BESTELLUNG NACH [Nachname], [Vorname];
Wenn Sie mit dem Schreiben von SQL-Syntax vertraut sind, können Sie sicherlich Ihre eigene SQL-Anweisung für die Union-Abfrage direkt in die SQL-Ansicht schreiben. Es kann jedoch hilfreich sein, den Ansatz des Kopierens und Einfügens von SQL aus anderen Abfrageobjekten zu verfolgen. Jede Abfrage kann viel komplizierter sein als die hier verwendeten einfachen ausgewählten Abfragebeispiele. Es kann von Vorteil sein, jede Abfrage sorgfältig zu erstellen und zu testen, bevor Sie sie in der Vereinigungsabfrage kombinieren. Wenn die Union-Abfrage nicht ausgeführt werden kann, können Sie jede Abfrage einzeln anpassen, bis sie erfolgreich ist, und dann Ihre Union-Abfrage mit der korrigierten Syntax neu erstellen.
Lesen Sie die verbleibenden Abschnitte dieses Artikels, um weitere Tipps und Tricks zur Verwendung von Union-Abfragen zu erhalten.
Im Beispiel aus dem vorherigen Abschnitt mit der Northwind-Datenbank werden nur Daten aus zwei Tabellen kombiniert. Sie können jedoch sehr einfach drei oder mehr Tabellen in einer Union-Abfrage kombinieren. Aufbauend auf dem vorherigen Beispiel möchten Sie vielleicht auch die Namen der Mitarbeiter in die Abfrageausgabe aufnehmen. Sie können diese Aufgabe erfüllen, indem Sie eine dritte Abfrage hinzufügen und mit der vorherigen SQL-Anweisung mit einem zusätzlichen UNION-Schlüsselwort wie dem folgenden kombinieren:
WÄHLEN Sie Kunden.Firma, Kunden.[Nachname], Kunden.[Vorname] VON Kunden UNION SELECT Suppliers.Company, Suppliers.[Nachname], Suppliers.[Vorname] VON Lieferanten UNION SELECT Mitarbeiter.Firma, Mitarbeiter.[Nachname], Mitarbeiter.[Vorname] VON Mitarbeitern BESTELLUNG NACH [Nachname], [Vorname];
Wenn Sie das Ergebnis in der Datenblattansicht anzeigen, werden alle Mitarbeiter mit dem Beispielfirmennamen aufgelistet, was wahrscheinlich nicht sehr nützlich ist. Wenn dieses Feld angeben soll, ob es sich bei einer Person um einen internen Mitarbeiter, einen Lieferanten oder einen Kunden handelt, können Sie anstelle des Firmennamens einen festen Wert angeben. So würde die SQL aussehen:
WÄHLEN Sie „Kunde" als Beschäftigung, Kunden.[Nachname], Kunden.[Vorname] VON Kunden UNION WÄHLEN Sie „Lieferant" als Beschäftigung, Lieferanten.[Nachname], Lieferanten.[Vorname] VON Lieferanten UNION WÄHLEN Sie „Inhouse" als Anstellung, Mitarbeiter.[Nachname], Mitarbeiter.[Vorname] VON Mitarbeitern BESTELLUNG NACH [Nachname], [Vorname];
So wird das Ergebnis in der Datenblattansicht angezeigt. Access zeigt diese fünf Beispieldatensätze an:
Anstellung | Familienname, Nachname | Vorname |
Im Haus | Freehafer | Nancy |
Im Haus | Giussani | Laura |
Anbieter | Glasson | Stuart |
Kunde | Goldschmidt | Daniel |
Kunde | Gratacós Solsona | Antonio |
Die obige Abfrage kann noch weiter reduziert werden, da Access in einer Union-Abfrage nur die Namen der Ausgabefelder aus der ersten Abfrage liest. Hier sehen Sie, dass wir die Ausgabe aus dem zweiten und dritten Abfrageabschnitt entfernt haben:
WÄHLEN Sie „Kunde" als Beschäftigung, [Nachname], [Vorname] VON Kunden UNION WÄHLEN Sie „Lieferant", [Nachname], [Vorname] VON Lieferanten UNION WÄHLEN Sie „Inhouse", [Nachname], [Vorname] VON Mitarbeitern BESTELLUNG NACH [Nachname], [Vorname];
In einer Access Union-Abfrage ist die Sortierung nur einmal zulässig, aber jede Abfrage kann einzeln gefiltert werden. Aufbauend auf der Union-Abfrage des vorherigen Abschnitts ist hier ein Beispiel dafür, wo wir jede Abfrage gefiltert haben, indem wir eine WHERE-Klausel hinzugefügt haben.
WÄHLEN Sie „Kunde" als Beschäftigung, Kunden.[Nachname], Kunden.[Vorname] VON Kunden WHERE [Bundesland/Provinz] = "UT" UNION WÄHLEN Sie „Lieferant", [Nachname], [Vorname] VON Lieferanten WHERE [Jobtitel] = „Vertriebsleiter" UNION WÄHLEN Sie „Inhouse", Mitarbeiter.[Nachname], Mitarbeiter.[Vorname] VON Mitarbeitern WO Stadt = "Seattle" BESTELLUNG NACH [Nachname], [Vorname];
Wechseln Sie zur Datenblattansicht und Sie sehen ähnliche Ergebnisse:
Anstellung | Familienname, Nachname | Vorname |
Anbieter | Andersen | Elisabeth A. |
Im Haus | Freehafer | Nancy |
Kunde | Hasselberg | Jonas |
Im Haus | Hellung Larsen | Anne |
Anbieter | Hernández-Echevarria | Amaya |
Kunde | Mortensen | Sven |
Anbieter | Sandberg | Michael |
Anbieter | Sousa | Luis |
Im Haus | Thorpe | Stefan |
Anbieter | Weiler | Cornelia |
Im Haus | Zare | Robert |
Wenn die Abfragen für Union sehr unterschiedlich sind, kann es vorkommen, dass ein Ausgabefeld Daten verschiedener Datentypen kombinieren muss. In diesem Fall gibt die Union-Abfrage die Ergebnisse meistens als Textdatentyp zurück, da dieser Datentyp sowohl Text als auch Zahlen enthalten kann.
Um zu verstehen, wie dies funktioniert, verwenden wir die Union-Abfrage „ Product Transactions " in der Northwind-Beispieldatenbank. Öffnen Sie diese Beispieldatenbank und dann die Abfrage „Produkttransaktionen" in der Datenblattansicht. Die letzten zehn Datensätze sollten dieser Ausgabe ähneln:
Produkt ID | Auftragsdatum | Name der Firma | Transaktion | Menge |
77 | 22.1.2006 | Lieferant B | Kaufen | 60 |
80 | 22.1.2006 | Lieferant D | Kaufen | 75 |
81 | 22.1.2006 | Lieferant A | Kaufen | 125 |
81 | 22.1.2006 | Lieferant A | Kaufen | 200 |
7 | 20.01.2006 | Firma d | Verkauf | 10 |
51 | 20.01.2006 | Firma d | Verkauf | 10 |
80 | 20.01.2006 | Firma d | Verkauf | 10 |
34 | 15.01.2006 | Firma AA | Verkauf | 100 |
80 | 15.01.2006 | Firma AA | Verkauf | 30 |
Nehmen wir an, Sie möchten das Feld Menge in zwei Teile aufteilen – Kaufen und Verkaufen. Nehmen wir außerdem an, Sie möchten einen festen Nullwert für das Feld ohne Wert haben. So sieht die SQL für diese Union-Abfrage aus:
WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], 0 als Kauf, [Menge] als Verkauf VON [Produktbestellungen] UNION WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, 0 als Verkauf VON [Produktkäufe] BESTELLUNG BEI [Bestelldatum] DESC;
Wenn Sie zur Datenblattansicht wechseln, werden die letzten zehn Datensätze jetzt wie folgt angezeigt:
Produkt ID | Auftragsdatum | Name der Firma | Transaktion | Besorgen | Verkaufen |
74 | 22.1.2006 | Lieferant B | Kaufen | 20 | 0 |
77 | 22.1.2006 | Lieferant B | Kaufen | 60 | 0 |
80 | 22.1.2006 | Lieferant D | Kaufen | 75 | 0 |
81 | 22.1.2006 | Lieferant A | Kaufen | 125 | 0 |
81 | 22.1.2006 | Lieferant A | Kaufen | 200 | 0 |
7 | 20.01.2006 | Firma d | Verkauf | 0 | 10 |
51 | 20.01.2006 | Firma d | Verkauf | 0 | 10 |
80 | 20.01.2006 | Firma d | Verkauf | 0 | 10 |
34 | 15.01.2006 | Firma AA | Verkauf | 0 | 100 |
80 | 15.01.2006 | Firma AA | Verkauf | 0 | 30 |
Um dieses Beispiel fortzusetzen, was ist, wenn Sie möchten, dass die Felder mit Null leer sind? Sie können die SQL so ändern, dass nichts anstelle von Null angezeigt wird, indem Sie das Schlüsselwort Null wie folgt hinzufügen:
WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], Null als Kauf, [Menge] als Verkauf VON [Produktbestellungen] UNION WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, Null als Verkauf VON [Produktkäufe] BESTELLUNG BEI [Bestelldatum] DESC;
Wie Sie jedoch vielleicht beobachtet haben, wie Sie zur Datenblattansicht wechseln, erhalten Sie jetzt ein unerwartetes Ergebnis. In der Spalte „Kaufen" sind alle Felder leer:
Produkt ID | Auftragsdatum | Name der Firma | Transaktion | Besorgen | Verkaufen |
74 | 22.1.2006 | Lieferant B | Kaufen | ||
77 | 22.1.2006 | Lieferant B | Kaufen | ||
80 | 22.1.2006 | Lieferant D | Kaufen | ||
81 | 22.1.2006 | Lieferant A | Kaufen | ||
81 | 22.1.2006 | Lieferant A | Kaufen | ||
7 | 20.01.2006 | Firma d | Verkauf | 10 | |
51 | 20.01.2006 | Firma d | Verkauf | 10 | |
80 | 20.01.2006 | Firma d | Verkauf | 10 | |
34 | 15.01.2006 | Firma AA | Verkauf | 100 | |
80 | 15.01.2006 | Firma AA | Verkauf | 30 |
Der Grund dafür ist, dass Access die Datentypen der Felder aus der ersten Abfrage bestimmt. In diesem Beispiel ist Null keine Zahl.
Was passiert also, wenn Sie versuchen, eine leere Zeichenfolge für den leeren Wert von Feldern einzufügen? Die SQL für diesen Versuch könnte wie folgt aussehen:
WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], „" als Kauf, [Menge] als Verkauf VON [Produktbestellungen] UNION WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, „" als Verkauf VON [Produktkäufe] BESTELLUNG BEI [Bestelldatum] DESC;
Wenn Sie zur Datenblattansicht wechseln, sehen Sie, dass Access die Buy-Werte abruft, die Werte jedoch in Text konvertiert. Sie erkennen, dass es sich um Textwerte handelt, da sie in der Datenblattansicht linksbündig ausgerichtet sind. Die leere Zeichenfolge in der ersten Abfrage ist keine Zahl, weshalb Sie diese Ergebnisse sehen. Sie werden auch feststellen, dass die Verkaufswerte ebenfalls in Text konvertiert werden, da die Kaufdatensätze eine leere Zeichenfolge enthalten.
Produkt ID | Auftragsdatum | Name der Firma | Transaktion | Besorgen | Verkaufen |
74 | 22.1.2006 | Lieferant B | Kaufen | 20 | |
77 | 22.1.2006 | Lieferant B | Kaufen | 60 | |
80 | 22.1.2006 | Lieferant D | Kaufen | 75 | |
81 | 22.1.2006 | Lieferant A | Kaufen | 125 | |
81 | 22.1.2006 | Lieferant A | Kaufen | 200 | |
7 | 20.01.2006 | Firma d | Verkauf | 10 | |
51 | 20.01.2006 | Firma d | Verkauf | 10 | |
80 | 20.01.2006 | Firma d | Verkauf | 10 | |
34 | 15.01.2006 | Firma AA | Verkauf | 100 | |
80 | 15.01.2006 | Firma AA | Verkauf | 30 |
Wie löst man also dieses Rätsel?
Eine Lösung besteht darin, die Abfrage zu zwingen, zu erwarten, dass der Feldwert eine Zahl ist. Dies kann mit dem Ausdruck erreicht werden:
IIf(Falsch, 0, Null)
Die zu prüfende Bedingung False ist niemals True , daher gibt der Ausdruck immer Null zurück, aber Access wertet dennoch beide Ausgabeoptionen aus und entscheidet, ob die Ausgabe numerisch oder Null ist.
So können wir diesen Ausdruck in unserem Arbeitsbeispiel verwenden:
WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], IIf(False, 0, Null) als Kauf, [Menge] als Verkauf VON [Produktbestellungen] UNION WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, Null als Verkauf VON [Produktkäufe] BESTELLUNG BEI [Bestelldatum] DESC;
Beachten Sie, dass die zweite Abfrage nicht geändert werden muss.
Wenn Sie zur Datenblattansicht wechseln, sehen Sie jetzt ein Ergebnis, das wir wollen:
Produkt ID | Auftragsdatum | Name der Firma | Transaktion | Besorgen | Verkaufen |
74 | 22.1.2006 | Lieferant B | Kaufen | 20 | |
77 | 22.1.2006 | Lieferant B | Kaufen | 60 | |
80 | 22.1.2006 | Lieferant D | Kaufen | 75 | |
81 | 22.1.2006 | Lieferant A | Kaufen | 125 | |
81 | 22.1.2006 | Lieferant A | Kaufen | 200 | |
7 | 20.01.2006 | Firma d | Verkauf | 10 | |
51 | 20.01.2006 | Firma d | Verkauf | 10 | |
80 | 20.01.2006 | Firma d | Verkauf | 10 | |
34 | 15.01.2006 | Firma AA | Verkauf | 100 | |
80 | 15.01.2006 | Firma AA | Verkauf | 30 |
Eine alternative Methode, um dasselbe Ergebnis zu erzielen, besteht darin, den Abfragen in der Union-Abfrage eine weitere Abfrage voranzustellen:
WÄHLEN 0 als [Produkt-ID], Date() als [Bestelldatum], "" Als [Firmenname], "" Als [Transaktion], 0 als Kauf, 0 als Verkauf VON [Produktbestellungen] WO Falsch
Access gibt für jedes Feld feste Werte des von Ihnen definierten Datentyps zurück. Natürlich möchten Sie nicht, dass die Ausgabe dieser Abfrage die Ergebnisse beeinträchtigt. Der Trick, dies zu vermeiden, besteht darin, eine WHERE-Klausel in False einzufügen:
WO Falsch
Dies ist ein kleiner Trick, da dies immer falsch ist und die Abfrage dann nichts zurückgibt. Wenn wir diese Anweisung mit dem vorhandenen SQL kombinieren, erhalten wir eine vollständige Anweisung wie folgt:
WÄHLEN 0 als [Produkt-ID], Date() als [Bestelldatum], "" Als [Firmenname], "" Als [Transaktion], 0 als Kauf, 0 als Verkauf VON [Produktbestellungen] WO Falsch UNION WÄHLEN Sie [Produkt-ID], [Bestelldatum], [Firmenname], [Transaktion], Null als Kauf, [Menge] als Verkauf VON [Produktbestellungen] UNION WÄHLEN Sie [Produkt-ID], [Erstellungsdatum], [Firmenname], [Transaktion], [Menge] als Kauf, Null als Verkauf VON [Produktkäufe] BESTELLUNG BEI [Bestelldatum] DESC;
Hinweis: Die kombinierte Abfrage hier in diesem Beispiel mit der Northwind-Datenbank gibt 100 Datensätze zurück, während die beiden einzelnen Abfragen 58 und 43 Datensätze zurückgeben, also insgesamt 101 Datensätze. Der Grund für diese Diskrepanz liegt darin, dass zwei Datensätze nicht eindeutig sind. Im Abschnitt Arbeiten mit unterschiedlichen Datensätzen in Union-Abfragen mit UNION ALL erfahren Sie, wie Sie dieses Szenario mit UNION ALL lösen können.
Ein Sonderfall für eine Union-Abfrage besteht darin, eine Reihe von Datensätzen mit einem Datensatz zu kombinieren, der die Summe eines oder mehrerer Felder enthält.
Hier ist ein weiteres Beispiel, das Sie in der Northwind-Beispieldatenbank erstellen können, um zu veranschaulichen, wie Sie in einer Vereinigungsabfrage eine Summe erhalten.
Erstellen Sie eine neue einfache Abfrage zum Anzeigen des Bierkaufs (Produkt-ID=34 in der Northwind-Datenbank) mit der folgenden SQL-Syntax:
WÄHLEN Sie [Bestelldetails].[Eingangsdatum], [Bestelldetails].Menge VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=34)) ORDER BY [Einzelheiten der Bestellung].[Datum des Eingangs];
Wechseln Sie zur Datenblattansicht und Sie sollten vier Käufe sehen:
Empfangsdatum
Menge
22.1.2006
100
22.1.2006
60
4.4.2006
50
05.04.2006
300
Um die Gesamtsumme zu erhalten, erstellen Sie eine einfache aggregierende Abfrage mit dem folgenden SQL:
SELECT Max([Empfangsdatum]), Sum([Quantity]) AS SumOfQuantity VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=34))
Wechseln Sie zur Datenblattansicht und Sie sollten nur einen Datensatz sehen:
MaxOfDate erhalten
SummeDerMenge
05.04.2006
510
Kombinieren Sie diese beiden Abfragen zu einer Vereinigungsabfrage, um den Datensatz mit der Gesamtmenge an die Kaufdatensätze anzuhängen:
WÄHLEN Sie [Bestelldetails].[Eingangsdatum], [Bestelldetails].Menge VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=34)) UNION SELECT Max([Empfangsdatum]), Sum([Quantity]) AS SumOfQuantity VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=34)) ORDER BY [Einzelheiten der Bestellung].[Datum des Eingangs];
Wechseln Sie zur Datenblattansicht und Sie sollten die vier Käufe mit der Summe von jedem sehen, gefolgt von einem Datensatz, der die Gesamtmenge ergibt:
Empfangsdatum
Menge
22.1.2006
60
22.1.2006
100
4.4.2006
50
05.04.2006
300
05.04.2006
510
Das deckt die Grundlagen des Hinzufügens von Summen zu einer Union-Abfrage ab. Möglicherweise möchten Sie auch feste Werte in beide Abfragen aufnehmen, z. B. „Detail" und „Gesamt", um den Gesamtdatensatz visuell von den anderen Datensätzen zu trennen. Sie können die Verwendung fester Werte im Abschnitt Kombinieren von drei oder mehr Tabellen oder Abfragen in einer Vereinigungsabfrage überprüfen .
Union-Abfragen in Access enthalten standardmäßig nur unterschiedliche Datensätze. Was aber, wenn Sie alle Datensätze einbeziehen möchten? Ein weiteres Beispiel könnte hier hilfreich sein.
Im vorherigen Abschnitt haben wir Ihnen gezeigt, wie Sie in einer Vereinigungsabfrage eine Summe erstellen. Ändern Sie diese Union-Abfrage-SQL so, dass sie die Produkt-ID = 48 enthält:
WÄHLEN Sie [Bestelldetails].[Eingangsdatum], [Bestelldetails].Menge VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=48)) UNION SELECT Max([Empfangsdatum]), Sum([Quantity]) AS SumOfQuantity VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=48)) ORDER BY [Einzelheiten der Bestellung].[Datum des Eingangs];
Wechseln Sie zur Datenblattansicht und Sie sollten ein etwas irreführendes Ergebnis sehen:
Empfangsdatum | Menge |
22.1.2006 | 100 |
22.1.2006 | 200 |
Ein Datensatz ergibt in Summe natürlich nicht die doppelte Menge.
Sie sehen dieses Ergebnis, weil an einem Tag die gleiche Menge Pralinen zweimal verkauft wurde – wie in der Tabelle „Purchase Order Details" erfasst. Hier ist ein einfaches Auswahlabfrageergebnis, das beide Datensätze in der Northwind-Beispieldatenbank zeigt:
Bestellnummer | Produkt | Menge |
100 | Northwind Traders Schokolade | 100 |
92 | Northwind Traders Schokolade | 100 |
In der zuvor erwähnten Vereinigungsabfrage können Sie sehen, dass das Feld „Purchase Order ID" nicht enthalten ist und dass die beiden Felder keine zwei unterschiedlichen Datensätze bilden.
Wenn Sie alle Datensätze einschließen möchten, verwenden Sie UNION ALL anstelle von UNION in Ihrem SQL. Dies wirkt sich höchstwahrscheinlich auf die Sortierung der Ergebnisse aus, daher sollten Sie möglicherweise auch eine ORDER BY-Klausel einfügen, um eine Sortierreihenfolge festzulegen. Hier ist das modifizierte SQL, das auf dem vorherigen Beispiel aufbaut:
WÄHLEN Sie [Bestelldetails].[Eingangsdatum], Null als [Gesamtsumme], [Bestelldetails].Menge VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=48)) UNION ALLE SELECT Max([Empfangsdatum]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity VON [Bestelldetails] WO ((([Bestelldetails].[Produkt-ID])=48)) BESTELLEN BEI [Gesamt];
Wechseln Sie in die Datenblattansicht und Sie sollten alle Details sowie eine Gesamtsumme als letzten Datensatz sehen:
Empfangsdatum | Gesamt | Menge |
22.1.2006 | 100 | |
22.1.2006 | 100 | |
22.1.2006 | Gesamt | 200 |
Eine übliche Verwendung für eine Union-Abfrage besteht darin, als Datensatzquelle für ein Kombinationsfeld-Steuerelement in einem Formular zu dienen. Sie können dieses Kombinationsfeld verwenden, um einen Wert auszuwählen, um die Datensätze des Formulars zu filtern. Filtern Sie beispielsweise die Mitarbeiterdatensätze nach ihrer Stadt.
Um zu sehen, wie dies funktionieren könnte, ist hier ein weiteres Beispiel, das Sie in der Northwind-Beispieldatenbank erstellen können, um dieses Szenario zu veranschaulichen.
Erstellen Sie eine einfache Auswahlabfrage mit dieser SQL-Syntax:
SELECT Mitarbeiter.Stadt, Mitarbeiter.Stadt AS Filter VON Mitarbeitern;
Wechseln Sie zur Datenblattansicht und Sie sollten die folgenden Ergebnisse sehen:
Stadt
Filter
Seattle
Seattle
Bellevue
Bellevue
Redmond
Redmond
Kirkland
Kirkland
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
Wenn Sie sich diese Ergebnisse ansehen, sehen Sie möglicherweise nicht viel Wert. Erweitern Sie die Abfrage jedoch und wandeln Sie sie mit dem folgenden SQL in eine Union-Abfrage um:
SELECT Mitarbeiter.Stadt, Mitarbeiter.Stadt AS Filter VON Mitarbeitern UNION SELECT "<All>", "*" AS Filter VON Mitarbeitern ORDER NACH Stadt;
Wechseln Sie zur Datenblattansicht und Sie sollten die folgenden Ergebnisse sehen:
Stadt
Filter
<Alle>
*
Bellevue
Bellevue
Kirkland
Kirkland
Redmond
Redmond
Seattle
Seattle
Access führt eine Vereinigung der zuvor gezeigten neun Datensätze mit festen Feldwerten von <All> und "*" durch.
Da diese Union-Klausel UNION ALL nicht enthält, gibt Access nur unterschiedliche Datensätze zurück, was bedeutet, dass jede Stadt nur einmal mit festen identischen Werten zurückgegeben wird.
Da Sie nun über eine fertige Union-Abfrage verfügen, die jeden Städtenamen nur einmal anzeigt, zusammen mit einer Option, die effektiv alle Städte auswählt, können Sie diese Abfrage als Datensatzquelle für ein Kombinationsfeld in einem Formular verwenden. Wenn Sie dieses spezifische Beispiel als Modell verwenden, könnten Sie ein Kombinationsfeld-Steuerelement in einem Formular erstellen, diese Abfrage als Datensatzquelle festlegen, die Eigenschaft „Spaltenbreite" der Spalte „Filter" auf 0 (Null) festlegen, um sie visuell auszublenden, und dann die Gebundene Column-Eigenschaft auf 1, um den Index der zweiten Spalte anzugeben. In der Filter-Eigenschaft des Formulars selbst können Sie dann Code wie den folgenden hinzufügen, um einen Formularfilter zu aktivieren, der den Wert dessen verwendet, was im Kombinationsfeld-Steuerelement ausgewählt wurde:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Der Benutzer des Formulars kann dann die Formulardatensätze nach einem bestimmten Städtenamen filtern oder <Alle> auswählen, um alle Datensätze für alle Städte aufzulisten.
No comments:
Post a Comment