Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Anzahl der Gruppenmitglieder, mit Distinct (https://www.delphipraxis.net/192925-anzahl-der-gruppenmitglieder-mit-distinct.html)

hoika 1. Jun 2017 20:17

Datenbank: FB • Version: 2.0 • Zugriff über: egal

Anzahl der Gruppenmitglieder, mit Distinct
 
Hm,
blöder Titel, aber egal:
Ich habe 2 Tabelle
Gruppe: GruppeNr,GruppenBezeichnung
Mitglied: Id, MitgliedNr, GruppenNr, Start, Ende

In Mitglied kann mehrfach in einer Gruppe sein.
Ich suche jetzt eine Liste aller Gruppen mit der Anzahl der Mitglieder,
mehrfach vorhandene Mitglieder sollen aber nur einmal gezählt werden.

Select Sum(), GruppenBezeichnung
GroupBy

liefert mir aber doppelte Mitglieder auch doppelt.
Das will ich aber nicht. Was nun?

Im Moment behelfe ich mich mit
Select GruppenBezeichnung, Select Distinct Count(*), usw.
Das erzeugt aber ein unschönes SubSelect

p80286 2. Jun 2017 07:04

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Mach 3 Tabellen:
Gruppe: GruppeNr,GruppenBezeichnung
GruMi: GruppeNr,MitgliedNr
Mitglied: Id, MitgliedNr, Start, Ende

Falls sich Start und Ende auf die Gruppenmitgliedschaft bezieht, gehören die beiden in GruMi.
Und es ist kein Fehler jeder Tabelle eine ID zu spendieren.

Gruppe: ID,GruppeNr,GruppenBezeichnung
GruMi: ID,GruppeID,MitgliedID
Mitglied: Id, MitgliedNr, Start, Ende

Gruß
K-H

Olli73 2. Jun 2017 07:20

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Vielleicht hilft dir das hier weiter?!

jobo 2. Jun 2017 08:13

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Versuch mal sowas:
Code:
select GruppenBezeichnung, count(*)
  from Gruppe G
  join (select MitgliedNR, min(GruppenNR) as MinGruppenNR from Mitglied group by MitgliedNR) M
    on G.GruppenNr = M.MinGruppenNR
 group by GruppenBezeichnung

nahpets 2. Jun 2017 10:07

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Sehe ich das richtig?

Du möchtest 1.

von Mitglied: Id, MitgliedNr, GruppenNr, Start, Ende
SQL-Code:
select distinct MitgliedNr, GruppenNr from Mitglied


und 2. möchtest Du

SQL-Code:
select count(*) as Anzahl, GruppenNr, GruppenBezeichnung from Gruppe, group by GruppenNr, GruppenBezeichnung


Und das soll dann kombiniert werden.
SQL-Code:
select Count(*) as Anzahl, g.GruppenNr, g.GruppenBezeichnung
from Gruppe g,
(select distinct MitgliedNr, GruppenNr from Mitglied) m
where g.GruppenNr = m.GruppenNr
group by g.GruppenNr, g.GruppenBezeichnung
Für
SQL-Code:
(select distinct MitgliedNr, GruppenNr from Mitglied) m

würd' ich mir 'ne View machen.
SQL-Code:
create view v_Distinc_Mitglied_Gruppe as
select distinct MitgliedNr, GruppenNr from Mitglied
Dann wird obiges SQL etwas lesbarer:
SQL-Code:
select Count(*) as Anzahl, g.GruppenNr, g.GruppenBezeichnung
from Gruppe g, v_Distinc_Mitglied_Gruppe m
where g.GruppenNr = m.GruppenNr
group by g.GruppenNr, g.GruppenBezeichnung

mschaefer 2. Jun 2017 12:25

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Moin zusammen,

das mit Hoika's Distinct finde ich zunächst schlicht gut, denn es trifft das Ergebnis bei kompaktem SQL-Ausdruck.
Bei einer insgesamt komplexen SQL würde ich auch die Idee von Nahpets View verwenden, das sieht dann windschnittig nach übersichtlichem Join aus. Der Gedanke von p80286 das ordentlich zu Normalisieren wäre natürlich das Optimum, aber die böse Praxis 'planiert' einem die Tabellenstruktur oft. Mir würde jetzt noch eine Variante mit HAVING Count (Memembername) = 1 einfallen. Das geht, ist aber von der Eleganz des Distinct doch geblendet. Die Oracle Freaks könnten auch noch mit SELECT ROW_NUMBER() OVER(PARTITION by Membername auffahren und dann immer die Row_Number=1, erster Satz der Gruppe, nehmen, dass hilft dann beim Abschrecken neuer Kollegen.

Also Hoika: - ist schon gut so - :wink:


Grüße in die Runde // Martin

hoika 2. Jun 2017 13:54

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Hallo,
keine Meckerei wegen DB-Design hier, war doch nur ein Beispiel.
So wie vorgeschlagen (Select x, Select())) habe ich es ja.

Aber das erzeugt einen SubSelect, den wollte ich vermeiden.
Da FB keine materialized Views kennt, bringt der View (außer Lesebarkeit) leider auch nichts.

Egal, bleibt so, ich habe wichtigere Sachen zu tun.

Schöne Pfingsten an alle hier.


Zitat:

Mir würde jetzt noch eine Variante mit HAVING Count (Memembername) = 1 einfallen
Das würde mir doch die Mitglieder, die mehrfach in der Gruppe sind, dann doch gar nicht mehr anzeigen, oder?

Olli73 2. Jun 2017 14:07

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Und was ist mit
Code:
select count(distinct Feldname) from ...
aus meinem Link oben?

hoika 2. Jun 2017 15:55

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Hallo,
den Link habe ich nicht verstanden,
genauer wie das mir was bringen soll, ein Subselect zu vermeiden.

Olli73 2. Jun 2017 16:01

AW: Anzahl der Gruppenmitglieder, mit Distinct
 
Zitat:

Zitat von hoika (Beitrag 1373346)
Hallo,
den Link habe ich nicht verstanden,
genauer wie das mir was bringen soll, ein Subselect zu vermeiden.

Wenn ich dich richtig verstanden habe, dann bringt doch das
Code:
select count(distinct Feldname) from ...
das gewünschte Ergebnis (doppelte Einträge werden nicht gezählt)?!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz