| Autor |
Beitrag |
laserflor
      
Beiträge: 37
Win XP, Win 2000, Win 98, Win NT4
D5 Prof
|
Verfasst: 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  ) 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
Gruß Rolf
Moderiert von raziel: Color- durch Code-Tags ersetzt.
_________________ Setze Dir ein Ziel und Du findest den Weg.
|
|
j-a-n@gmx.de
      
Beiträge: 84
Delphi 7
|
Verfasst: Fr 02.09.05 13:57
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 
      
Beiträge: 37
Win XP, Win 2000, Win 98, Win NT4
D5 Prof
|
Verfasst: 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)
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 
      
Beiträge: 37
Win XP, Win 2000, Win 98, Win NT4
D5 Prof
|
Verfasst: 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) 
|
|
j-a-n@gmx.de
      
Beiträge: 84
Delphi 7
|
Verfasst: 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
      
Beiträge: 534
|
Verfasst: 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 
      
Beiträge: 37
Win XP, Win 2000, Win 98, Win NT4
D5 Prof
|
Verfasst: 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
Gruß Rolf
|
|
Amiga-Fan
      
Beiträge: 534
|
Verfasst: 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 
      
Beiträge: 37
Win XP, Win 2000, Win 98, Win NT4
D5 Prof
|
Verfasst: 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
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
      
Beiträge: 84
Delphi 7
|
Verfasst: 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.
_________________ --
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
|
|
laserflor 
      
Beiträge: 37
Win XP, Win 2000, Win 98, Win NT4
D5 Prof
|
Verfasst: Do 08.09.05 16:09
Amiga-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 
      
Beiträge: 37
Win XP, Win 2000, Win 98, Win NT4
D5 Prof
|
Verfasst: 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
      
Beiträge: 84
Delphi 7
|
Verfasst: Do 08.09.05 17:08
_________________ --
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
|
|