Entwickler-Ecke

Datenbanken - GROUP BY Frage


laserflor - Fr 02.09.05 11:42
Titel: GROUP BY Frage
Hallo an alle,
hier textet ein SQL-Neuling.
Ich bin vor kurzem von der BDE auf Firebird umgestiegen und komme eigentlich (auch dank des Delphi-Forums :lol: ) ganz gut klar.
Jetzt würde ich gern mit Hilfe der GROUP BY Option die Anzahl von Datensätzen ausgeben, wo ein Feld identisch ist.


Quelltext
1:
SELECT feld1, COUNT(*) FROM db GROUP BY feld1                    


Das tut er brav und zählt die Anzahl der Elemente, die sich z.B. in feld3 unterscheiden.

Nun existiert zur Obergruppe feld1 noch eine Untergruppe feld2 und ich hätte gern eine dritte Spalte, wo mir das Statement zählt, wieviele Untergruppen zur Obergruppe gehören.

Wie geht das?

Was ich probiert habe, führte nur dazu, dass ich die Anzahl der Elemente, die zu feld2 gehören, herausbekam :oops:

Gruß Rolf

Moderiert von user profile iconraziel: Color- durch Code-Tags ersetzt.


j-a-n@gmx.de - Fr 02.09.05 13:57


Quelltext
1:
SELECT feld1, COUNT(*), count(distinct feld2) FROM db GROUP BY feld1                    


laserflor - Fr 02.09.05 15:51

Danke für die schnelle Beantwortung :)
Leider wirft die Lösung schon wieder eine neue Frage auf, da ich das Statement wie folgt erweitert habe:

Quelltext
1:
SELECT feld1, COUNT(*), COUNT(DISTINCT feld2) FROM db GROUP BY feld1 HAVING (NOT feld2 = ' ')                    

Daraufhin erscheint der Fehler:
Invalid Expression in the HAVING clause (neither an aggregat funtion nor a part of the GROUP BY clause) :roll:
Wenn ich nun

Quelltext
1:
SELECT feld1, COUNT(*), COUNT(DISTINCT feld2) FROM db GROUP BY feld1, feld2 HAVING (NOT feld2 = ' ')                    

schreibe, ist COUNT(DISTINCT feld2) immer 1
Gibt es eine Adresse, wo das mit dem GROUP BY auf deutsch gut erklärt ist?
Gruß


laserflor - Fr 02.09.05 16:04

Sorry..
meine einfache Lösung:
SELECT feld1, COUNT(*), COUNT(DISTINCT feld2)-1 FROM db GROUP BY feld1 da HAVING (NOT feld2 = ' ') immer genau 1 weniger zählen würde (wenn es täte) :oops:


j-a-n@gmx.de - Fr 02.09.05 16:08

über group by und having kannste jahrelang studieren und immer noch nicht alles wissen.

mit having kannst nach dem gruppieren noch einschränken, also beispielsweise  having count(*) > 1.
mit where schränkst du vor dem gruppieren ein, also beispielsweise  where feld2 <> ''

wenn du das feld2 mit in die group by aufnimmst, gruppierst du nach beiden feldern gleichzeitig.

Was du jetzt genau erwartest versteh ich nicht ganz. Vielleicht kannst du es mal mit worten erklären oder ein konkretes beispiel bringen?


Amiga-Fan - Fr 02.09.05 16:12

Zitat:
Ich bin vor kurzem von der BDE auf Firebird umgestiegen


wie meinst du das - verstehe ich nicht.


laserflor - Fr 02.09.05 16:38

user profile iconAmiga-Fan hat folgendes geschrieben:
Zitat:
Ich bin vor kurzem von der BDE auf Firebird umgestiegen


wie meinst du das - verstehe ich nicht.


BDE = Borland Database Engine = Paradox = Dateibasierte Datenbank: Damit habe ich so an 5 Jahre programmiert. Meine Datenbank wurde mir aber dann zu langsam (Suchfunktion, Filter, Indexerstellung beim Einfügen von Datensätzen etc.)

Firebird = Client/Server-Datenbank: Vor ca. 2 Monaten bin ich darauf gekommen, die Datenbank umzustellen und seitdem schlage ich mich mit der SQL-Syntax herum :twisted:

Gruß Rolf


Amiga-Fan - Fr 02.09.05 16:41

Zitat:
Borland Database Engine = Paradox


wie meinst du das?


laserflor - Fr 02.09.05 16:43

user profile iconj-a-n@gmx.de hat folgendes geschrieben:
über group by und having kannste jahrelang studieren und immer noch nicht alles wissen.

mit having kannst nach dem gruppieren noch einschränken, also beispielsweise  having count(*) > 1.
mit where schränkst du vor dem gruppieren ein, also beispielsweise  where feld2 <> ''

wenn du das feld2 mit in die group by aufnimmst, gruppierst du nach beiden feldern gleichzeitig.

Was du jetzt genau erwartest versteh ich nicht ganz. Vielleicht kannst du es mal mit worten erklären oder ein konkretes beispiel bringen?


Das mit dem DICTINCT war schon Klasse :idea:

In der Tabelle existieren aber jede Menge Datensätze, wo feld2 nur ein Leerzeichen enthält. Beim Gruppieren ergibt das immer genau einen Datensatz mehr, den ich nun einfach mit -1 abziehe, anstatt eine WHERE oder HAVING Klausel zu benutzen.

Gruß Rolf


j-a-n@gmx.de - Mo 05.09.05 08:09

user profile iconlaserflor hat folgendes geschrieben:

In der Tabelle existieren aber jede Menge Datensätze, wo feld2 nur ein Leerzeichen enthält. Beim Gruppieren ergibt das immer genau einen Datensatz mehr, den ich nun einfach mit -1 abziehe, anstatt eine WHERE oder HAVING Klausel zu benutzen.

aha...
und wenn das feld mal keine leerzeichen enthält?
Wenn Du die Anzahl nur schätzen willst, kannste auch random() nehmen.


laserflor - Do 08.09.05 16:09

user profile iconAmiga-Fan hat folgendes geschrieben:
Zitat:
Borland Database Engine = Paradox


wie meinst du das?

Die Frage verstehe ich nicht wirklich, aber schau mal in Wikipedia [http://de.wikipedia.org/wiki/Borland_Database_Engine]. Sollte dann noch etwas unklar sein, bitte PN


laserflor - Do 08.09.05 16:12

user profile iconj-a-n@gmx.de hat folgendes geschrieben:
user profile iconlaserflor hat folgendes geschrieben:

In der Tabelle existieren aber jede Menge Datensätze, wo feld2 nur ein Leerzeichen enthält. Beim Gruppieren ergibt das immer genau einen Datensatz mehr, den ich nun einfach mit -1 abziehe, anstatt eine WHERE oder HAVING Klausel zu benutzen.

aha...
und wenn das feld mal keine leerzeichen enthält?
Wenn Du die Anzahl nur schätzen willst, kannste auch random() nehmen.

Heißt das

Quelltext
1:
SELECT feld1, COUNT(*), count(distinct feld2) FROM db WHERE (NOT feld2 = ' ') GROUP BY feld1                    

müsste funktionieren?
Gruß Rolf


j-a-n@gmx.de - Do 08.09.05 17:08

user profile iconlaserflor hat folgendes geschrieben:

Heißt das

Quelltext
1:
SELECT feld1, COUNT(*), count(distinct feld2) FROM db WHERE (NOT feld2 = ' ') GROUP BY feld1                    

müsste funktionieren?


dann werden bei count(*) auch nur die gezählt, bei denen Feld2 nicht leer ist.
ansonsten musst du zwei mal fragen:

Quelltext
1:
SELECT feld1, COUNT(*) FROM db GROUP BY feld1                    


Quelltext
1:
SELECT feld1, count(distinct feld2) FROM db WHERE feld2 <> ' ' GROUP BY feld1