Was man bei
GROUP BY
beachten muß |
 |
|
|
RNr. |
Empfänger |
Betrag |
Status |
| 1 |
Müller |
10 |
bezahlt |
| 2 |
Müller |
20 |
bezahlt |
| 3 |
Müller |
40 |
offen |
| 4 |
Müller |
80 |
offen |
| 5 |
Hoffmann |
1000 |
bezahlt |
| 6 |
Hoffmann |
2000 |
bezahlt |
| 7 |
Hoffmann |
4000 |
bezahlt |
| 8 |
Hoffmann |
8000 |
offen |
Gegeben ist wieder eine Tabelle Rechnungen. Die Spalte Status gibt an,
ob die Rechnung bereits bezahlt ist oder noch offen (nicht bezahlt)
|
 |
GROUP-BY: Was man
beachten muß |
|
Schauen wir uns einmal folgenden select-Befehl an, und überlegen
warum er nicht funktionieren wird:
select Empfänger, sum(Betrag)
from rechnung
group by status;
Wir überlegen, wie der dieser select Befehl arbeitet:
Zuerst werden 2 Gruppen gebildet: offen und bezahlt
Insgesamt werden also nur zwei Zeilen ausgegeben!
Jetzt überlegen wir: Wenn die erste Zeile die ausgegeben
wird die "bezahlt" Zeile ist, welchen Namen soll der
select-Befehl hinter "bezahlt" schreiben. Schließlich hat
sowohl Kunde Müller als auch Kunde Hoffmann bereits
Rechnungen bezahlt! Deshalb kann der obige Befehl
nicht funktionieren.
Besondere Vorsicht ist geboten, wenn erst wenige Datensätze in
der Tabelle stehen:
RNr. |
Empfänger |
Betrag |
Status |
| 1 |
Müller |
10 |
bezahlt |
| 2 |
Müller |
20 |
bezahlt |
| 3 |
Hoffmann |
8000 |
offen |
Hier haben alle bezahlten Rechnungen den Empfänger "Müller", und
alle offenen Rechnungen den Empfänger Hoffmann. Hier würde der
obige Befehl funktionieren, jedoch nur, bis eine offene Rechnung
eingegeben wird, die nicht den Empfänger "Hoffmann" hat.
|
|