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
raziel: 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
Amiga-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
j-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
laserflor 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:12
j-a-n@gmx.de hat folgendes geschrieben: |
laserflor 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
laserflor 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 |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!