| SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden. |
 |

22-11-2011, 14:34
|
|
doerfnix
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Beiträge: 9
|
|
Datenbank Struktur, Gruppen, Auswerten
Hallo,
Ich zerbreche mir im Moment den Kopf über ein kleines Problem und finde keine zufrieden stellende Lösung :
Ich habe ein Datenbank mit Name :
id Vorname Nachname Land
1 Karl Muster D
2 Jens Schmidt NL
3 Tanja Schmidt NL
4 Gustav Schmidt NL
....
Nun möchte ich einzelne Einträge als Gruppe markieren ( z.B. eine Familie )
-> Jens und Tanja Schmidt sind eine Familie, Gustav gehört nicht dazu.
id Vorname Nachname Gruppe Land
1 Karl Muster NULL D
2 Jens Schmidt 1 NL
3 Tanja Schmidt 1 NL
4 Gustav Schmidt NULL NL
....
Soweit so gut.
Nun möchte ich herausfinden wie viele Familien in welchen Land Wohnen
-> SELECT COUNT(id) FROM fam GROUP BY land
Wie bekomme ich es hin das doppelte Einträge in Gruppe nur einmal gezählt werden ??
Ich habe da irgendwie tomaten auf den Augen im mom. Oder hat jemand vieleicht eine bessere Idee wie ich in dem Fall die Tabelle aufbauen sollte ?
doerfnix
|

22-11-2011, 14:36
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
SELECT Land, COUNT(DISTINCT Gruppe) FROM fam GROUP BY Land
|

22-11-2011, 14:39
|
|
doerfnix
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Beiträge: 9
|
|
Das Funktioniert nicht , beim oben genannten Beispiel würde
D 0 NL 1
herauskommen. Das habe ich auch schon probiert
|

22-11-2011, 14:52
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Also für mich sieht das Ergebnis korrekt aus.
|

22-11-2011, 14:54
|
|
doerfnix
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Beiträge: 9
|
|
Das korrekte Ergebnis müßte lauten : D 1 NL 2
|

22-11-2011, 14:54
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Warum?
|

22-11-2011, 15:03
|
|
doerfnix
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Beiträge: 9
|
|
1 Karl Muster NULL D -> 1 * D
2 Jens Schmidt 1 NL -> 1 * NL
3 Tanja Schmidt 1 NL -> doppelt, gehört zu id 2
4 Gustav Schmidt NULL NL -> 2 * NL
1 * D, 2 NL
In wirklichkeit steckt hier eine Kunden Datenbank dahinter, es gibt vereinzelt Kunden wo wir Kontakt zu einzelnen Abteilungen haben und diese Einzeln gelistet werden sollen, aber in der Statistik als 1 Kunde gezählt werden sollen.
Ich habe mir das so gedacht : Kunden-Tabelle mit allen Kunden ( z.B. MusterFirma, Müller Firma Abt. Holz, Müller Firma Abt. Stahl ... ) und eine Tabelle in der Gruppe-Namen gelistet sind ( z.B. Müller Firma) .
In der Auflistung werden diese dann als eine Firma mit Unterpunkten angezeigt:
- Muster Firma
- Firma Müller :
- Abt. Holz
- Abt. Stahl
Vileicht gibt es ja auch eine bessere Lösung. In der Gruppentabelle nochmal alle Firmen aufzulisten, auch wenn es nur eine Abt. gibt, finde ich nicht so prikelnd.
doerfnix
|

22-11-2011, 15:16
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
firma:
id, firmenname
abteilung:
id, firma_id, abteilungsname
kunde:
id, abteilung_id, vorname, nachname
Aber wo hängt jetzt das Land? Beim Kunden oder bei der Abteilung?
|

22-11-2011, 20:53
|
|
doerfnix
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Beiträge: 9
|
|
Die Firma ist unser Kunde, also kann hier eine Tabelle wegfallen.
PHP-Code:
firma: id, firmenname
abteilung: id, firma_id, abteilungsname , Land
In 98% der fällen ist es nur so das Firmenname == Abteilung ist, sodas hier eine Menge Overhead entsteht, den wollte ich irgendwie vermeiden. Aus diesen Grund hatte ich die Idee die erste Tabelle ( id, firmenname ) nur zu für die 2 % zu nutzen, bei denen es wirklich mehr als 1 Abteilung gibt.
Aber ich glaube ich komme nicht daran vorbei hier die beiden Tabellen parallel zu pflegen.
doerfnix
|

23-11-2011, 16:57
|
|
doerfnix
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Beiträge: 9
|
|
Hallo,
Ich habe heute nochmal ein bisschen rumgespielt und folgende Lösung gefunden:
PHP-Code:
select *, ( ohneGruppe.kunden + gruppe.gruppen) as anzahl from ( select land, count(id) as kunden from kunden where kunden.`group` is null group by land ) as ohneGruppe left join ( select land, count(DISTINCT `group`) as gruppen from kunden group by land ) as gruppe ON (ohneGruppe.region = gruppe.region)
Ergibt dann folgendes Ergebnis :
PHP-Code:
land kunden land gruppen anzahl D 1 D 0 1 NL 1 NL 1 2
Geändert von doerfnix (23-11-2011 um 17:00 Uhr)
Grund: Text Formatiert
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|