SELECT COUNT(A.DATUM) As [Zahl-der-Umsätze]
FROM UMSATZ As A
Beachten Sie, daß Ihnen diese Abfrage 9 als Ergebnis zurückliefert, also die Zahl der nichtleeren
Zellen. Fügen Sie einen weiteren Datensatz ein und lassen bei diesem das Feld DATUM leer, so erhalten Sie
mit der obigen Abfrage weiterhin das Ergebnis 9.
Es wird nicht 2 (die Zahl der verschiedenen Datumsangaben) ausgegeben. Sind alle Zellen einer
Tabelle belegt, so ist es für diese Abfrage mit COUNT unerheblich, welche Zelle Sie verwenden.SELECT A.DATUM, COUNT(A.DATUM) As [Zahl-der-Umsätze-pro-Tag]
FROM UMSATZ As A
GROUP BY A.DATUM
Sie erhalten als Ergebnis zwei Zeilen, für jede der unterschiedlichen Datumsangaben eine Zeile. Jede Zeile
enthält die zusätzliche Zelle 'Zahl-der-Umsätze-pro-Tag' mit den Werten 6 für den 24.06 und 3 für den 25.06.99.
Verzichten Sie auf die Ausgabespalte A.DATUM, so können Sie die beiden Zellen mit den Werten 6 und 3 nicht
mehr interpretieren.SELECT MAX(A.A_PREIS) As [teuerster-Artikel]
FROM ARTIKEL As A
Dies liefert Ihnen den Preis des teuersten Artikels (360.00). Beachten Sie, daß Sie mit dieser Abfrage noch nicht den Namen
oder die Details dieses Artikels erfahren. Dies gelingt nur, wenn Sie das obige Ergebnis selbst als
Kriterium in einer Where-Abfrage verwenden. Näheres finden Sie im Abschnitt über Unterabfragen. Hier
eine Möglichkeit:
SELECT B.*
FROM ARTIKEL As B
WHERE B.A_PREIS = (SELECT MAX(A.A_PREIS) As [teuerster-Artikel]
FROM ARTIKEL As A)
| Ergebnis: | | | A_NR | A_NAME | A_PREIS | | 22 | Mantel | 360.00 |
|
SELECT SUM(A.A_PREIS * B.A_STUECK) As [Gesamtumsatz]
FROM ARTIKEL As A INNER JOIN UMSATZ As B
ON A.A_NR = B.A_NR
Diese Abfrage kombiniert jede Umsatz-Zeile mit der zu ihr gehörenden Artikel-Zeile. Damit sind
die Spalten A_PREIS und A_STUECK bekannt und können miteinander multipliziert werden. Ohne die Aggregatfunktion
SUM würden neun Zeilen mit dem tatsächlichen Umsatz dieser einzelnen Verkaufshandlung ausgegeben. So wird
über all diese Einzelergebnisse summiert und der Gesamtumsatz von 27.472,00 ermittelt.SELECT A.A_NR, SUM(A.A_PREIS * B.A_STUECK) As [Umsatz-dieses-Artikels]
FROM ARTIKEL As A INNER JOIN UMSATZ As B
ON A.A_NR = B.A_NR
GROUP BY A.A_NR
| Ergebnis: | | | A_NR | Umsatz-dieses-Artikels | | 11 | 4.862,00 | | 12 | 1.990,00 | | 13 | 4.420,00 | | 22 | 16.200,00 |
|
Diese Aggregation zerlegt den Gesamtstapel der neun Umsätze zunächst in Teilstapel anhand der
Artikelnummern. Für jeden Teilstapel wird multipliziert und die Summe ermittelt. Das Ergebnis wird,
ergänzt um die Information, zu welchem Artikel die Summation gehört, ausgegeben.SELECT B.DATUM,
MAX(A.A_PREIS * B.A_STUECK) As [Max-Tages-Einzelumsatz]
FROM ARTIKEL As A INNER JOIN UMSATZ As B
ON A.A_NR = B.A_NR
GROUP BY B.DATUM
| Ergebnis: | | | DATUM | Max-Tages-Einzelumsatz | | 24.06.1999 | 3.867,50 | | 25.06.1999 | 12.600,00 |
|
Anstelle der obigen Summation wird das Maximum über alle Einzelumsätze für jeden Tag ermittelt. Beachten Sie,
daß Sie auch mit dieser Abfrage nicht ermitteln können, welcher Artikel für diesen höchsten Umsatz
verantwortlich ist. Denn sobald Sie zur Gruppierung die Artikel-Nummer hinzunehmen, erhalten Sie für jede
Kombination aus Artikel und Tag eine Zeile, so daß das Maximum über solche einzeiligen Teilmengen gleich
dem Wert in dieser Zelle ist. Möchten Sie zusätzlich wissen, welcher Artikel für diesen höchsten Einzelumsatz
zuständig ist, so kombinieren Sie diese Abfrage als JOIN mit einer direkten Multiplikation:
SELECT A.DATUM, A.A_NR, A.Einzelumsatz
FROM
(SELECT C.DATUM, B.A_NR,
B.A_PREIS * C.A_STUECK As [Einzelumsatz]
FROM ARTIKEL As B INNER JOIN UMSATZ As C
ON B.A_NR = C.A_NR) AS A
INNER JOIN (
SELECT Y.DATUM,
MAX(X.A_PREIS * Y.A_STUECK) As [Max-Tages-Einzelumsatz]
FROM ARTIKEL As X INNER JOIN UMSATZ As Y
ON X.A_NR = Y.A_NR
GROUP BY Y.DATUM) As D
ON (A.DATUM = D.DATUM) AND
(A.Einzelumsatz = D.[Max-Tages-Einzelumsatz])
| Ergebnis: | | | DATUM | A_NR | Einzelumsatz | | 24.06.1999 | 13 | 3.867,50 | | 25.06.1999 | 22 | 12.600,00 |
|
Unterstützt das Datenbanksystem - im Gegensatz zu Access - eine direkte Multiplikation im JOIN-Ausdruck,
so können Sie den ersten geklammerten JOIN-Ausdruck herausziehen und die Multiplikation direkt in der
JOIN-Klausel durchführen.SELECT B.DATUM, B.A_NR,
SUM(A.A_PREIS * B.A_STUECK) As Tagesumsatz
FROM ARTIKEL As A INNER JOIN UMSATZ As B
ON A.A_NR = B.A_NR
GROUP BY B.DATUM, B.A_NR
| Ergebnis: | | | DATUM | A_NR | Tagesumsatz | | 24.06.1999 | 11 | 3.094,00 | | 24.06.1999 | 12 | 1.990,00 | | 24.06.1999 | 13 | 4.420,00 | | 24.06.1999 | 22 | 3.600,00 | | 25.06.1999 | 11 | 1.768,00 | | 25.06.1999 | 22 | 12.600,00 |
|
Das ist nun die klassische ausdifferenzierte Version: Die tatsächlichen Einzelumsätze werden pro Tag und
pro Artikel aggregiert, das Ergebnis wird mit den beiden gruppierenden Spalten ausgegeben.
SELECT A.DATUM, A.A_NR, COUNT(*) As [Umsatz-Anzahl]
FROM UMSATZ As A
GROUP BY A.DATUM, A.A_NR
HAVING COUNT(*) > 1
| Ergebnis: | | | DATUM | A_NR | Umsatz-Anzahl | | 24.06.1999 | 12 | 2 | | 24.06.1999 | 13 | 2 | | 25.06.1999 | 11 | 2 |
|
Ohne HAVING-Klausel würde diese Abfrage sechs Zeilen zurückliefern - vier für den 24.06, an dem vier Artikel
verkauft wurden, 2 für den 25.06. Die HAVING-Klausel definiert eine zusätzliche Einschränkung und beschränkt
die Ausgabe auf jene Artikel, die mindestens zwei Mal verkauft worden sind.
SELECT A.A_NR, SUM(A.A_PREIS * B.A_STUECK) As [Umsatz-dieses-Artikels]
FROM ARTIKEL As A INNER JOIN UMSATZ As B
ON A.A_NR = B.A_NR
GROUP BY A.A_NR
HAVING SUM(A.A_PREIS * B.A_STUECK) > 10000
Dies ermittelt jene Artikel, mit welchen ein Umsatz von über 10.000 gemacht wurde. Die SQL-Abfrage
ist dieselbe wie unter Beispiel 5, es wurde nur die HAVING-Klausel hinzugefügt. Artikel 22 wird ausgegeben.
Dies sind die Funktionen, die jedes Datenbanksystem mit Sql-Schnittstelle anbieten dürfte. Hinweise
für weitere Funktionen Ihres Systems finden Sie in der zugehörigen Dokumentation. Die Aggregatfunktionen mit
numerischem Bezug (SUM, AVG) können nur für Spalten verwendet werden, welche numerische Datentypen enthalten.