Autor Beitrag
laserflor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 37

Win XP, Win 2000, Win 98, Win NT4
D5 Prof
BeitragVerfasst: Fr 02.09.05 11:42 
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.

ausblenden 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.

_________________
Setze Dir ein Ziel und Du findest den Weg.
j-a-n@gmx.de
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84


Delphi 7
BeitragVerfasst: Fr 02.09.05 13:57 
ausblenden Quelltext
1:
SELECT feld1, COUNT(*), count(distinct feld2) FROM db GROUP BY feld1					

_________________
--
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
laserflor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 37

Win XP, Win 2000, Win 98, Win NT4
D5 Prof
BeitragVerfasst: 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:
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 37

Win XP, Win 2000, Win 98, Win NT4
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84


Delphi 7
BeitragVerfasst: 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?

_________________
--
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
Amiga-Fan
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Fr 02.09.05 16:12 
Zitat:
Ich bin vor kurzem von der BDE auf Firebird umgestiegen


wie meinst du das - verstehe ich nicht.

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
laserflor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 37

Win XP, Win 2000, Win 98, Win NT4
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Fr 02.09.05 16:41 
Zitat:
Borland Database Engine = Paradox


wie meinst du das?

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
laserflor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 37

Win XP, Win 2000, Win 98, Win NT4
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84


Delphi 7
BeitragVerfasst: 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.

_________________
--
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
laserflor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 37

Win XP, Win 2000, Win 98, Win NT4
D5 Prof
BeitragVerfasst: 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. Sollte dann noch etwas unklar sein, bitte PN
laserflor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 37

Win XP, Win 2000, Win 98, Win NT4
D5 Prof
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84


Delphi 7
BeitragVerfasst: Do 08.09.05 17:08 
user profile iconlaserflor hat folgendes geschrieben:

Heißt das
ausblenden 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:
ausblenden Quelltext
1:
SELECT feld1, COUNT(*) FROM db GROUP BY feld1					

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

_________________
--
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.