In den einzelnen Spalten einer Abfrage können auch Formeln zur Berechnung einzelner Felder stehen.
GesamtNetto: [Preis]*[Menge]
In den einzelnen Spalten einer Abfrage können auch Formeln zur Berechnung einzelner Felder stehen.
GesamtNetto: [Preis]*[Menge]
Was wäre eine Datenbank ohne Abfragen?
Dabei spielen Auswahlabfragen wohl die Hauptrolle. Wenn es um die Analyse Ihrer Access-Daten geht, stoßen Auswahl ab – fragen aber schnell an ihre Grenzen. Da haben Kreuztabellenabfragen wesentlich mehr zu bieten. Ob Sie Umsatzstatistiken über mehrere Quartale oder Jahre benötigen oder wissen möchten, welche Umsätze die Vertriebsmitarbeiter bei welchen Kunden gemacht haben: alles kein Problem mit Kreuztabellenabfragen. Wir zeigen, wie Ihnen Kreuztabellen bei der Auswertung und Analyse Ihrer Datenbestände helfen.
Was Kreuztabellenabfragen gegenüber Auswahlabfragen auszeichnet, veranschaulicht am besten ein Beispiel.
Inhaltlich geht es in der Beispieldatenbank um Bestellinformationen, die sich aus Bestelldetails wie Bestelldatum und -menge sowie aus Personal-, Kunden- und Artikelinformationen zusammensetzen.
Nehmen Sie für das Beispiel an, dass Sie herausfinden wollen, wie viel Umsatz die Vertreter bei den einzelnen Kunden gemacht haben.
In einer Auswahlabfrage könnten Sie zu diesem Zweck die Mitarbeiter, die Kunden und die Bestellsummen ausgeben lassen. Wenn Sie dabei die Bestellsummen pro Kunde zusammenfassen, erhalten Sie eine Abfrage wie „0_qryBestellsummen“ in der Beispieldatenbank.
So haben Sie zwar die gewünschten Zahlen, besonders übersichtlich ist die Liste aber nicht, da Sie die Umsätze der einzelnen Mitarbeiter kaum miteinander vergleichen können. Ein wesentlich aussagekräftigeres Ergebnis erzielen Sie mit einer Kreuztabellenabfrage, wie die Abfrage „1_qryVertreterumsatz“ beweist.
Die Umsätze der Mitarbeiter lassen sich in diesem Fall auf einen Blick erfassen. Das liegt daran, dass Kreuztabellenabfragen die Spaltenüberschriften dynamisch aus Feldinhalten erzeugen und dann die passenden Werte in das Raster aus Zeilen- und Spaltenüberschriften eintragen. So lassen sich hier die Mitarbeiterumsätze schnell den einzelnen Firmen zuordnen.
Der Aufwand zum Anlegen einer Kreuztabelle ist nicht größer als der für eine Auswahlabfrage. Besonders komfortabel geht es mit dem Kreuztabellenabfrage-Assistenten.
Beachten Sie aber, dass der Assistent eine Datenbasis voraussetzt, die alle Informationen für die Kreuztabelle enthält. Nur selten werden Sie mit einer Tabelle auskommen. Häufiger werden Sie die Datenbasis erst mithilfe einer Auswahlabfrage aus mehreren Tabellen zusammenstellen müssen. Das trifft auch auf die Beispieldatenbank zu. Hier liefert die Abfrage „_qryBestellungen“ die benötigten Werte.
Die folgende Anleitung zeigt, wie Sie den Kreuztabellenabfrage-Assistenten einsetzen, um eine Auswertung wie in der Abfrage „1_qryVertreterumsatz“ anzulegen:
Natürlich können Sie eine Kreuztabelle auch nachträglich bearbeiten oder ohne den Assistenten erstellen.
Dazu öffnen Sie eine bestehende oder eine neue Ab frage in der Entwurfs an sicht. Bei einer neuen Abfrage müssen Sie zuerst die Datenbasis auswählen und anschließend ABFRAGE-KREUZTABELLENABFRAGE aufrufen.
Zur Veranschaulichung erweitern Sie die Abfrage „1_qryVertreterumsatz“ um eine Gliederung des Umsatzes nach Jahren:
Lassen Sie die Jahresangabe der Bestelldaten in einem neuen Abfragefeld ausgeben, indem Sie in einer neuen Spalte der Zeile „Feld“ Folgendes eingeben:
Jahr: Jahr([Bestelldatum])
Sie müssen nur noch die Verwendung in der „Kreuztabelle“ einstellen. Da zu öffnen Sie die Dropdown-Liste in der entsprechenden Zeile und wählen in diesem Fall „Zeilenüberschrift“ an.
Das Resultat dieser Erweiterung entspricht der Abfrage „2_qry Umsatz ProJahr“ aus der Beispieldatenbank.
Es bietet sich an, die Abfrage „2_qry – UmsatzProJahr“ mit einem Parameter zu versehen, um interaktiv die Umsätze eines bestimmten Jahres abzufragen.
Auch das ist bei Kreuztabellen kein Problem:
Wenn Sie die Abfrage jetzt in der Datenblattansicht öffnen, fragt Access zuerst den Parameter ab.
Geben Sie im Beispiel eine Jahreszahl zwischen „1999“ und „2002“ ein, um sich anschließend die entsprechenden Jahresumsätze ausgeben zu lassen.
Bislang haben Sie immer die Inhalte eines Feldes als Spaltenüberschriften der Kreuztabelle verwendet. Sie können aber auch Ausdrücke als Spaltenüberschriften einsetzen.
Schauen Sie sich dazu die folgende Abbildung an:
Die Spaltenüberschriften geben Intervalle über die Höhe des Bestellvolumens an. Die Werte in der Tabelle selbst sagen aus, wie viele Bestellungen ein Kunde im Bereich zwischen „0 – 100 €“, „100 – 500 €“ usw. getätigt hat.
Wie Sie eine solche Kreuztabellenauswertung erstellen, sehen Sie im Entwurf der Abfrage „4a_qryBestellvolumen“.
Die Felder „Firma“ und „Bestellsumme“ werden in gewohnter Weise als Zeilenüberschrift bzw. Wert eingesetzt. Neu ist hier nur, dass Sie nicht die „Summe“, sondern die „Anzahl“ der Bestellsummen ausgeben lassen.
Die Spaltenüberschriften legen Sie mit einem Ausdruck fest, in dem Sie die Funktion „Schalter“ einsetzen. Die Funktion wertet ihre Argumente paarweise aus:
Der erste Teil entspricht einer Bedingung, die überprüft wird, der zweite Teil ist der Rückgabewert, sofern die Bedingung zutrifft. Gibt es keine Übereinstimmung, wird das nächste Argumenten paar ausgewertet. Auf diese Weise ordnen Sie die Werte der Kreuztabelle genau definierten Intervallen zu.
Als Spaltenüberschriften werden dann die Textwerte „0 – 100 €“, „100 – 500 €“ usw. ausgegeben. Wenn Sie sich die Abfrage „4a_qry Bestellvolumen“ in der Datenblattansicht anschauen, werden Sie schnell ein Manko entdecken:
Die Sortierung der Spaltenüberschriften entspricht nicht der mathematischen Logik.
Das liegt daran, dass Access die Werte immer in Form von Text sortiert und somit die Spalte „1000 – 2000 €“ vor die Spalte „500 – 1000 €“ stellt.
Abhilfe schafft ein manuelles Bearbeiten der Spaltenüberschriften, das Sie wie folgt erreichen:
1. Öffnen Sie die Abfrage, die Sie ändern wollen, in der Entwurfsansicht.
2. Klicken Sie eine freie Fläche im oberen (grauen) Entwurfsbereich mit der rechten Maustaste an und wählen Sie im Kontextmenü den Befehl EIGENSCHAFTEN an.
3. Im Dialogfenster mit den Abfrageeigenschaften geben Sie in das Feld FIXIERTE SPALTENÜBERSCHRIFTEN die Überschriften in der passenden Reihenfolge ein. Sie müssen die Werte jeweils als Text in Anführungszeichen und durch Semikolons getrennt eintragen.
In der Beispieldatenbank können Sie sich die Korrekturen in der Abfrage „4b_qry – Bestellvolumen“ anschauen.
Mit fixierten Spaltenüberschriften können Sie außerdem dafür sorgen, dass eine Kreuztabelle immer die gleiche Anzahl an Spalten umfasst. Access unterschlägt ansonsten Spalten, denen keine Werte zuzuordnen sind.
Wenn es zum Beispiel gar keine Bestellungen gibt, deren Höhe zwischen 0 und 100 Euro liegt, zeigt Access die Spalte in der Abfrage „4a_qry Bestellvolumen“ trotz des Intervalls aus der „Schalter“- Funktion nicht an.
Wie Sie an den Beispielen gesehen haben, lohnt es sich, Kreuztabellen abfragen etwas näher unter die Lupe zu nehmen. Die Auswertungen Ihrer Datenbestände werden sicherlich davon profitieren.
Wenn Sie sich das Ergebnis einer Abfrage anzeigen lassen, sind die Spaltenüberschriften in der Datenblattansicht häufig wenig verständlich: Niemand kommt beispielsweise bei „IDNtzT“ auf die Idee, dass es sich hier um eine Identifikationsnummer für den Typ von Notizen handelt.
Das liegt daran, dass Access bei Abfragen einfach nur den Feldnamen verwendet.
Wenig bekannt ist die Tatsache, dass Sie auch aussagekräftigere Beschriftungen verwenden können.
Access stellt zu diesem Zweck im Abfrageentwurf entsprechende Einstellmöglichkeiten bereit, die allerdings etwas versteckt sind:
Gleichzeitig können Sie in der Eigenschaft „Beschreibung“ einen Kommentar eingeben, der dann bei künftigen Änderungen von Nutzen sein könnte.
So werden Sie sich in ein paar Monaten beispielsweise kaum noch daran erinnern können, dass ID „0“ für private, ID „1“ für geschäftliche oder ID „2“ für sonstige Notizen steht. Mit einem entsprechenden Kommentar in dieser Eigenschaft können Sie bei Bedarf kurz nachschlagen.
Wenn Sie die Abfrage nun ausführen lassen, werden in der Datenblattansicht aussagekräftige Bezeichnungen als Spaltenüberschriften angezeigt.
Mit diesen Einstellmöglichkeiten lässt sich gleichzeitig die Auswahl in Kombinations- und Listenfeldern vereinfachen: Dort können Sie über die Einstellung der Eigenschaft „Spaltenüberschriften“ auf „Ja“ in mehrspaltigen Kombinationsfeldern und Listen für mehr Übersicht sorgen.
Hier werden die im Abfrageentwurf zugeordneten Bezeichnungen angezeigt und machen so deutlich, welche Informationen in den einzelnen Spalten abzulesen sind.
Als Kriterium in einer Abfrage folgenden Befehl setzen:
= Formulare![Formularname]![Feldname]
Zeitraum: Format([Bestelldatum];“mm/jjjj“)
Zeitraum = Ausgedachter Name der Spalte von der Abfrage
[Bestelldatum] = Feldname eines Datumfeldes
mm = Monat
jjjj = Jahr
Die Sortierung ist aber nach Ziffern, und nicht nach Datum:
01/2000
01/2001
01/2003
02/2001
02/2003
03/2000
usw.
Möchten Sie, das die Sortierung nach Datum verläuft…
01/2000
03/2000
01/2001
02/2001
01/2003
02/2003
usw.
… gilt folgender Befehl:
Zeitraum: DatSeriell(Jahr([Bestellungen].[Bestelldatum]);Monat([Bestellungen].[Bestelldatum]);1)
[Bestellungen].[Bestelldatum] = Das Feld Bestelldatum in der Tabelle Bestellungen
Name: [Nachname] & „, “ & [Vorname]
Importiert die Tabelle „Audit“ von der Datenbank „Audittransfer.mdb“ in die Datenbank als Tabelle „Audit“
DoCmd.TransferDatabase acImport, „Microsoft Access“, „C:\Daten\audittransfer.mdb“, acTable, „Audit“, „Audit“
DoCmd.OpenTable „NameTabelle“, acViewNormal
Frage:
Objekte im Datenbankfenster auszublenden ist ja kein Problem. Man klickt die entsprechenden Einträge einfach mit der rechten Maustaste an, ruft das Kontextmenü EIGENSCHAFTEN auf und schaltet das Kontrollkästchen AUSGEBLENDET ein. Nun stellt sich allerdings die Frage: Wie macht man die Objekte wieder sichtbar?
Antwort:
Die Bedienung von Access ist in diesem Punkt leider nicht besonders intuitiv. Die meisten Anwender versuchen, über Kontextmenüs im Datenbankfenster zum Erfolg zu kommen. Tatsächlich müssen Sie das Menü EXTRAS-OPTIONEN anwählen, auf die Registerkarte „Ansicht“ wechseln und das Kontrollkästchen AUSGEBLENDETE OBJEKTE aktivieren. Danach sind die versteckten Objekte wieder sichtbar; Sie können sie aufrufen und auf Wunsch bearbeiten. Um zu erreichen, dass die Objekte auch ohne das Aktivieren dieser Option wieder sichtbar sind, können Sie sie mit der rechten Maustaste anklicken, das Kontextmenü EIGENSCHAFTEN aufrufen und das Kontrollkästchen AUSGEBLENDET wieder ausschalten.
Im Folgenden stellen wir Ihnen nun die wichtigsten SQL-Anweisungen für den Einsatz in Ihren Datenbank mit praktischen Beispielen vor. Sie können einzelne Anweisungen mithilfe unserer Erweiterung „SQL-Eingabe“ (siehe Seite 6) oder per VBA im Direktfenster direkt in der Beispieldatenbank zu diesem Beitrag ausprobieren.
Datensätze auswählen
Um Datensätze aus einer Tabelle zu selektieren und beispielsweise einem Recordset zuzuweisen, verwenden Sie „SELECT“. Sie können entweder den kompletten Datensatz mit Angabe des Sternchens „*“ oder einzelne Felder durch Angabe einer Namensliste auswählen:
SELECT * | Feldliste FROM
Tabellenname
WHERE Bedingung
GROUP BY Feldname
ORDER BY Feldliste ADC | DESC;
„Tabellenname“ definiert die Tabelle, aus der Datensätze selektiert werden sollen. Die folgende Anweisung liefert beispielsweise alle Felder und alle Datensätze aus der Tabelle „Adressen“:
SELECT * FROM Adressen;
Über „WHERE“ können Sie eine Bedingung prüfen und so nur bestimmte Datensätze selektieren, die zum Beispiel wie in der folgenden Anweisung im Feld „Land“ den Inhalt „Belgien“ aufweisen:
SELECT * FROM Kunden
WHERE Land = ‚Belgien‘;
Mit „GROUP BY“ lassen sich Datensätze, die im Feld „Feldname“ gleiche Inhalte aufweisen, gruppieren. Die folgende Anweisung, die sich zum Beispiel der Eigenschaft „Datensatzherkunft“ eines Kombinationsfeldes zuweisen lässt, liefert eine alphabetisch sortierte Auswahl aller bisher verwendeten Länder aus der Tabelle „Adressen“:
SELECT Land FROM Adressen
GROUP BY Land ORDER BY Land;
„ORDER BY“ erlaubt schließlich die Sortierung nach einem oder mehreren der selektierten Felder. Die folgende Anweisung sortiert das Abfrageergebnis nach dem Feld „Umsatz“:
SELECT Firma, Umsatz FROM Lieferanten
ORDER BY Umsatz;
Für jedes Feld können Sie mit „ASC“ bzw. „DESC“ eine aufsteigende oder absteigende Sortierung festlegen. Mit der folgenden Anweisung erhalten Sie eine absteigend sortierte Umsatzübersicht, bei gleichen Umsatzzahlen wird nach dem Nachnamen aufsteigend sortiert:
SELECT * FROM Kunden
ORDER BY Umsatz DESC, Nachname
ASC;
Feldinhalte aktualisieren
Mit „UPDATE“ ändern Sie die Inhalte einzelner Felder in Datensätzen einer Tabelle:
UPDATE Tabellenname
SET Feldname=Ausdruck
WHERE Bedingung;
„Tabellenname“ legt die Tabelle fest, in der Datensätze aktualisiert werden sollen. Über den Parameter „Feldname“ bestimmen Sie das Feld, dessen Inhalt zu ändern ist. „Ausdruck“ ist entweder eine Konstante oder eine Berechnung. Die folgenden Anweisungen setzen zum Beispiel das Ja/Nein-Feld „Mailingaktion“ aller Datensätze der Tabelle „Kunden“ auf „Nein“ oder erhöhen alle Inhalte des Feldes „VKPreis“ um 5%:
UPDATE Kunden
SET Mailingaktion = No;
UPDATE Artikel
SET VKPreis = VKPreis * 1.05;
Nutzen Sie „WHERE“, um eine Bedingung zu definieren und so nur bestimmte Datensätze zu aktualisieren. Mit der folgenden Anweisung wird für alle Lieferanten, bei denen ein Umsatz von mehr als 10.000 Euro erzielt wurde, ein Rabatt von 15% für die Artikel der Warengruppe „Schokolade“ eingetragen:
UPDATE Lieferanten
SET Rabatt = 15
WHERE Umsatz > 10000 And
Warengruppe = ‚Schokolade‘;
Datensätze löschen
Zum Löschen von Datensätzen aus einer Tabellen nutzen Sie die Anweisung „DELETE“. Die Tabelle selbst bleibt erhalten:
DELETE * FROM Tabellenname
WHERE Bedingung;
„Tabellenname“ definiert die Tabelle, aus der Datensätze gelöscht werden sollen. Die folgende Anweisung löscht alle Datensätze aus der Tabelle „Bestellungen“:
DELETE * FROM Bestellungen;
Über „WHERE“ können Sie eine Bedingung prüfen und so nur bestimmte Datensätze löschen, bei denen z. B. der Umsatz unterhalb einer bestimmten Grenze liegt oder der letzte Besuch durch den Außendienst bereits mehrere Jahre zurückliegt:
DELETE * FROM Lieferanten
WHERE BestellungWert < 10000;
DELETE * FROM Kunden
WHERE Year([LetzterBesuch]) <= 2000;
Tabellen zusammenführen
Verwenden Sie „INSERT INTO“, um die Inhalte einer Tabelle zu einer anderen Tabelle hinzuzufügen. Dabei ist es möglich, nur einzelne Felder oder komplette Datensätze zu übertragen:
INSERT INTO Tabelle1 (Zielfelder)
SELECT *|Quellfelder FROM Tabelle2
WHERE Bedingung;
Die folgende Anweisung überträgt alle Datensätze aus einer Tabelle „Neue Adressen“ in eine Haupttabelle „Adressen“:
INSERT INTO Adressen
SELECT * FROM NeueAdressen;
Wenn Sie lediglich die Inhalte einzelner Felder übertragen möchten, spezifizieren Sie die Feldnamen für das Ziel in runden Klammern. Die Feldnamen im „SELECT“- Teil geben Sie ohne runde Klammern an. Die Namen der Quell- und Zielfelder können voneinander abweichen, aber die Datentypen müssen übereinstimmen! Die folgende Anweisung überträgt nur die Inhalte der Felder „NachnameNeu“ und „VornameNeu“ aus der Tabelle „Neue Adressen“ in die Felder „Nachname“ und „Vorname“ der Tabelle „Adressen“:
INSERT INTO Adressen (Nachname, Vorname)
SELECT NachnameNeu, VornameNeu
FROM NeueAdressen;
Mit „WHERE“ können Sie eine Bedingung prüfen und so nur bestimmte Feldinhalte oder Datensätze übertragen. In diesem Beispiel werden nur die Datensätze übertragen, bei denen das Feld „Land“ den Inhalt „Deutschland“ aufweist:
INSERT INTO Adressen SELECT *
FROM NeueAdressen
WHERE Land = ‚Deutschland‘;
Spezielle Operatoren für Kriterien nutzen
In SQL-Anweisungen können Sie also die Auswahl der Datensätze über eine „WHERE“-Klausel einschränken:
INSERT INTO Adressen SELECT *
FROM NeueAdressen
WHERE Land = ‚Deutschland‘;
UPDATE Lieferanten SET Rabatt = 10
WHERE Umsatz > 10000;
DELETE * FROM Lieferanten
WHERE Bestellungen < 100;
SELECT * FROM Kunden
WHERE Land <> ‚Deutschland‘;
In den meisten Fällen verwenden Sie dabei für Ihre Bedingungen die Standardoperatoren „=“ (gleich), „<“ (kleiner), „>“ (größer) oder „<>“ (ungleich). Daneben gibt es noch verschiedene Operatoren, mit denen sich Kriterien einfacher und übersichtlicher formulieren lassen.
Werte innerhalb von Bereichen prüfen
Mit „BETWEEN“ können Sie zum Beispiel leicht feststellen, ob ein Feldinhalt innerhalb bestimmter Grenzwerte liegt:
Feldname [NOT] BETWEEN Startwert
AND Endwert
„Feldname“ legt das Feld fest, dessen Inhalt in dem über „Startwert“ und „Endwert“ definierten Bereich liegen soll. Die folgende Anweisung selektiert nur die Lieferanten, bei denen der Umsatz im Bereich von 10.000 Euro bis 19.999 Euro liegt:
SELECT * FROM Lieferanten
WHERE Umsatz BETWEEN 10000 AND 19999;
Werteübereinstimmung prüfen Der Operator „IN“ erleichtert die Selektion von Datensätzen, die fest definierten Kriterien entsprechen müssen. So lassen sich zum Beispiel Bestellungen von Kunden der Benelux-Staaten einfacher und übersichtlicher selektieren: Beispielsweise für die Auswahl der Kunden aus den Benelux-Ländern: Numerische Werte oder Zahlen verwenden Sie ohne Anführungszeichen:
Werteübereinstimmung prüfen
Der Operator „IN“ erleichtert die Selektion von Datensätzen, die fest definierten Kriterien entsprechen müssen. So lassen sich zum Beispiel Bestellungen von Kunden der Benelux-Staaten einfacher und übersichtlicher selektieren:
Feldname IN (Wert1, Wert2, Wert3…)
Beispielsweise für die Auswahl der Kunden aus den Benelux-Ländern:
SELECT * FROM Bestellungen
WHERE Land IN (‚Belgien‘, ‚Niederlande‘, ‚Luxemburg‘);
Numerische Werte oder Zahlen verwenden Sie ohne Anführungszeichen:
SELECT * FROM Artikel
WHERE Warengruppe IN (400, 378, 127, 12, 47);
Feldinhalte mit Suchmuster überprüfen
Mithilfe von „LIKE“ können Sie Datensätze anhand eines Suchmusters selektieren. Der Suchbegriff darf dann nur teil weise im Feld enthalten sein, damit die Bedingung als erfüllt angesehen wird:
LIKE Ausdruck
So können Sie beispielsweise mit „LIKE ‘04*’“ alle Kunden mit Vorwahl im norddeutschen Raum oder mit „Like ‘*Hamburg*’“ alle Kunden auswählen, die in „Hamburg“ wohnen, auch wenn in das Feld „Ort“ zum Beispiel „Hamburg-Harburg“ oder „Bahrenfeld bei Hamburg“ eingetragen wurde:
SELECT Nachname, Vorname, Telefon
FROM Kunden
WHERE Left$(Telefon,2)= ’04*‘;
SELECT * FROM Adressen
WHERE Ort Like ‚*Hamburg*‘;
Das Sternchen „*“ steht als Platzhalter für beliebige Zeichen, sodass es z. B. bei „‘*Hamburg*’“ keine Rolle spielt, an welcher Position sich der Begriff im Feld befindet. Bei „‘04*’“ muss der Feldinhalt hingegen mit „04“ beginnen.