SQL - auf der Suche nach der korrekten Syntax für ein Mitgliederverzeichnis
Ich würde mich über einen Hinweis zu meiner kleinen Fragestellung sehr freuen.
Ich habe eine Datenbank mit 5 Spalten: Familien-ID, lfd-Nr, Nachname, Vorname, Geburtsdatum
Da sind ca 300 Datensätze drin. Z.Bsp:
01,01,Mustermann,Max,01.12.1960
01,02,Mustermann,Frieda,02.03.1965
01,03,Mustermann,Pubert,04.05.1977
02,01,Panzer,Paul,02.04.1964
02,02,Panzer,Friedegunde,17.11.1966
03,01,Pillemann,Knut,26.11.1969
03,02,Pillemann,Gerda, 18.07.1966
Meine Ausgabe soll so sein:
M
Mustermann
Max - 01.12.1960
Frieda - 02.03.1965
Pubert - 04.05.1977
P
Panzer
Paul - 02.04.1964
Friedegunde - 17.11.1966
Pillemann
Knut - 26.11.1969
Gerda - 18.07.1966
Ich versuch da jetzt schon eine ganze Weile dran, aber ich bekomm es nicht hin. Ich hoffe, dass aus meinem Beispiel klar wird, was ich eigentlich will. Ich habe also verschiedene Familien, die ich jeweils zusammengefasst darstellen möchte (Familien-ID). Der Nachname soll als Überschrift dargestellt werden. Die gesamten Namen sollen jedoch als Index den ersten Buchstaben bekommen...
Kann mir hier bitte jemand weiterhelfen?
vielen Dank schon mal
Markus
Ich habe eine Datenbank mit 5 Spalten: Familien-ID, lfd-Nr, Nachname, Vorname, Geburtsdatum
Da sind ca 300 Datensätze drin. Z.Bsp:
01,01,Mustermann,Max,01.12.1960
01,02,Mustermann,Frieda,02.03.1965
01,03,Mustermann,Pubert,04.05.1977
02,01,Panzer,Paul,02.04.1964
02,02,Panzer,Friedegunde,17.11.1966
03,01,Pillemann,Knut,26.11.1969
03,02,Pillemann,Gerda, 18.07.1966
Meine Ausgabe soll so sein:
M
Mustermann
Max - 01.12.1960
Frieda - 02.03.1965
Pubert - 04.05.1977
P
Panzer
Paul - 02.04.1964
Friedegunde - 17.11.1966
Pillemann
Knut - 26.11.1969
Gerda - 18.07.1966
Ich versuch da jetzt schon eine ganze Weile dran, aber ich bekomm es nicht hin. Ich hoffe, dass aus meinem Beispiel klar wird, was ich eigentlich will. Ich habe also verschiedene Familien, die ich jeweils zusammengefasst darstellen möchte (Familien-ID). Der Nachname soll als Überschrift dargestellt werden. Die gesamten Namen sollen jedoch als Index den ersten Buchstaben bekommen...
Kann mir hier bitte jemand weiterhelfen?
vielen Dank schon mal
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 132112
Url: https://administrator.de/forum/sql-auf-der-suche-nach-der-korrekten-syntax-fuer-ein-mitgliederverzeichnis-132112.html
Ausgedruckt am: 22.12.2024 um 19:12 Uhr
7 Kommentare
Neuester Kommentar
Mit welcher Sprache willstn das machen? Mit nem reinen Sql-Skript wird das so wohl kaum oder garnicht realisierbar sein denke ich ... ansonsten sind das doch nur ein paar abfragen bzw. schleifen Oo
z.B
select * from tabelle where nachname like 'M%' --> in ein array -->
foreach(array as index => nachname) {
select vorname,geb_dat from tabelle where nachname = nachname
}
usw...
hoffe das war das was du brauchst...
z.B
select * from tabelle where nachname like 'M%' --> in ein array -->
foreach(array as index => nachname) {
select vorname,geb_dat from tabelle where nachname = nachname
}
usw...
hoffe das war das was du brauchst...
Hallo,
suchst du ein DB-Design oder ein Abfrage-Code?
Sprechen wir hier von einer akademischen Aufgabe, oder einer praktischen (dann wäre DBMS und Darstellungssprache interessant)?
Beachtest du den Fall, dass Mitglieder einer Familie nicht den gleichen Nachnamen haben müssen? Unter welchem Buchstaben tauchen die dann auf?
Wenn du vereinfachend annimmst, dass alle den gleichen Nachnamen haben: In der Personen-Tabelle Spalte Nachname entfernen, dafür eine Tabelle "Familie" mit Spalten "FamilienID" und "Nachname" erstellen.
Weiterhin solltest du dir die GROUP BY-Funktion in SQL anschauen, ich denke, das ist letztlich das, was du suchst.
Gruß
Filipp
suchst du ein DB-Design oder ein Abfrage-Code?
Sprechen wir hier von einer akademischen Aufgabe, oder einer praktischen (dann wäre DBMS und Darstellungssprache interessant)?
Beachtest du den Fall, dass Mitglieder einer Familie nicht den gleichen Nachnamen haben müssen? Unter welchem Buchstaben tauchen die dann auf?
Wenn du vereinfachend annimmst, dass alle den gleichen Nachnamen haben: In der Personen-Tabelle Spalte Nachname entfernen, dafür eine Tabelle "Familie" mit Spalten "FamilienID" und "Nachname" erstellen.
Weiterhin solltest du dir die GROUP BY-Funktion in SQL anschauen, ich denke, das ist letztlich das, was du suchst.
Gruß
Filipp
Oder du machst es ganz einfach mit etwas Fleiss. Weil das Alphabet hat ja nicht mehr als 26 Grundbuchstaben... Somit ist der Aufwand nach meiner Methode relativ gering...
Zu beachten sind die Anzahl Blank-Spaces vor jedem \r\n, welche bei jeder neuen Zeile einen Blank-Space mehr sein muss als bei der Vorhergehenden.
Habe dir mal ein Beispiel gemacht welches den von dir gewünschten Output liefern sollte. Natürlich musst du die Tabellennamen, etc deinen Gegebenheiten anpassen.
Grüsse
Zu beachten sind die Anzahl Blank-Spaces vor jedem \r\n, welche bei jeder neuen Zeile einen Blank-Space mehr sein muss als bei der Vorhergehenden.
Habe dir mal ein Beispiel gemacht welches den von dir gewünschten Output liefern sollte. Natürlich musst du die Tabellennamen, etc deinen Gegebenheiten anpassen.
Grüsse
select 'A'
union
select j.username from jump_dev.juser j where j.username like 'a%'
union select '\r\n'
union
select 'B'
union
select j.username from jump_dev.juser j where j.username like 'b%'
union select ' \r\n'
union
select 'C'
union
select j.username from jump_dev.juser j where j.username like 'c%'
union select ' \r\n'
union
select 'D'
union
select j.username from jump_dev.juser j where j.username like 'd%'
union select ' \r\n'
union
select 'E'
union
select j.username from jump_dev.juser j where j.username like 'e%'
union select ' \r\n'
union
select 'F'
union
select j.username from jump_dev.juser j where j.username like 'f%'
union select ' \r\n'
union
select 'G'
union
select j.username from jump_dev.juser j where j.username like 'g%'
union select ' \r\n'
union
select 'H'
union
select j.username from jump_dev.juser j where j.username like 'h%'
union select ' \r\n'
union
select 'I'
union
select j.username from jump_dev.juser j where j.username like 'i%'
union select ' \r\n'
union
select 'J'
union
select j.username from jump_dev.juser j where j.username like 'j%'
union select ' \r\n'
union
select 'K'
union
select j.username from jump_dev.juser j where j.username like 'k%'
union select ' \r\n'
union
select 'L'
union
select j.username from jump_dev.juser j where j.username like 'l%'
union select ' \r\n'
union
select 'M'
union
select j.username from jump_dev.juser j where j.username like 'm%'
union select ' \r\n'
union
select 'N'
union
select j.username from jump_dev.juser j where j.username like 'n%'
union select ' \r\n'
union
select 'O'
union
select j.username from jump_dev.juser j where j.username like 'o%'
union select ' \r\n'
Moin,
naja - wenn schon einzelne Abfragen dann würde ich das mit nem Array lösen...
Erst nen Array mit jedem Buchstaben des Alphabet's bauen - und dann
foreach ($meinArray as $value) {
$query = "select username from ... where username like '$value%'";
}
Ansonsten kann man es natürlich auch machen das man sich alles der Benutzernamen sortiert aus der DB holt und dann immer den ersten Buchstaben mit dem letzten Schleifendurchlauf vergleicht. Unterscheidet sich das Ergebnis
vom letzten durchlauf vom aktuellen Durchlauf dann muss man halt den Buchstaben drüber schreiben der jetzt dran kommt... (hier schreibe ich absichtlich keine Lösung - da es sich m.E. um eine typische Hausaufgabe handelt und
ich doch das Denken nicht komplett abnehmen möchte)
naja - wenn schon einzelne Abfragen dann würde ich das mit nem Array lösen...
Erst nen Array mit jedem Buchstaben des Alphabet's bauen - und dann
foreach ($meinArray as $value) {
$query = "select username from ... where username like '$value%'";
}
Ansonsten kann man es natürlich auch machen das man sich alles der Benutzernamen sortiert aus der DB holt und dann immer den ersten Buchstaben mit dem letzten Schleifendurchlauf vergleicht. Unterscheidet sich das Ergebnis
vom letzten durchlauf vom aktuellen Durchlauf dann muss man halt den Buchstaben drüber schreiben der jetzt dran kommt... (hier schreibe ich absichtlich keine Lösung - da es sich m.E. um eine typische Hausaufgabe handelt und
ich doch das Denken nicht komplett abnehmen möchte)
Moin Kugman,
meiner Ansicht nach ist die Query nur unter Randbedingungen (siehe unten) mit SQL-Mitteln zu lösen.
Zwei elementare Randbedingungen wären:
a) Du verrätst mal, welches Datenbankblech drunterliegt, denn ein Standard-SQL gibt es weder heute noch in 200 Jahren.
b) und du erklärst mal dein Primary-Key-Konzept....
wenn die Eindeutigkeit eine Datensatzes vermutlich durch "FamilienID" +"LfdNr" sichergestellt wird,
die logische Sortierung aber "Nachname" + Lfdnr sein soll, dann ist es nicht sonderlich geschickt.
Zur Verdeutlichung - in deinen Beispieldaten oben geht es ja auf wunderbare Weise auf... die kleinste FamilienID ist auch die alphabetisch "erste" usw.
Wie würde dir die Mimik laufen, wenn du irgendwann in deinen Mitgliederdaten eine NEUE FamilienId anlegen musst (z.B die FamID 99, weil halt schon 98 Fam-Ids vergeben sind, und der Nachname aber mit "A" anfängt? Oder wenn du zwei Familien-IDs 47 und 11 hast und der Nachname jeweils "Müller" ist ?
Anyhow, eine etwas kürzere Union-Variante sähe in Access-Syntax so aus:
...und würde folgenden Output als ResultSet liefern
Die Tabelle heißt bei mir "Kugmans",
die jeweiligen Leerzeilen habe ich hier beim proof-of-concept durch Debug-Text ersetzt,
ebenfalls ergänzt als POC habe ich einen neuen Datensatz mit den Werten FamId 4, LfdNr 1, "Biber", Vorname, Datum.
Eine weitere denkbare Leerzeile wäre z.B mit " UNION SELECT "--Leerzeile nach Fam-- ", Asc( Left(Nachname,1))*10000 +FamID*1000-+1" machbar
ABER: Die Reihenfolge ("sortorder" in der Query) hängt dennoch nur vom Anfangsbuchstaben des Nachnamens + FamId + LfdNr ab, nicht vom Nachnamen selbst.
Grüße
Biber
meiner Ansicht nach ist die Query nur unter Randbedingungen (siehe unten) mit SQL-Mitteln zu lösen.
Zwei elementare Randbedingungen wären:
a) Du verrätst mal, welches Datenbankblech drunterliegt, denn ein Standard-SQL gibt es weder heute noch in 200 Jahren.
b) und du erklärst mal dein Primary-Key-Konzept....
wenn die Eindeutigkeit eine Datensatzes vermutlich durch "FamilienID" +"LfdNr" sichergestellt wird,
die logische Sortierung aber "Nachname" + Lfdnr sein soll, dann ist es nicht sonderlich geschickt.
Zur Verdeutlichung - in deinen Beispieldaten oben geht es ja auf wunderbare Weise auf... die kleinste FamilienID ist auch die alphabetisch "erste" usw.
Wie würde dir die Mimik laufen, wenn du irgendwann in deinen Mitgliederdaten eine NEUE FamilienId anlegen musst (z.B die FamID 99, weil halt schon 98 Fam-Ids vergeben sind, und der Nachname aber mit "A" anfängt? Oder wenn du zwei Familien-IDs 47 und 11 hast und der Nachname jeweils "Müller" ist ?
Anyhow, eine etwas kürzere Union-Variante sähe in Access-Syntax so aus:
SELECT x.Displine
FROM (
SELECT Vorname & ' - ' & GebDatum as DispLine,
Asc( Left(Nachname,1))*10000 + Kugmans.FamId*1000 + Kugmans.LfdNr*2 AS Sortorder
FROM Kugmans
UNION
SELECt DISTINCT left(nachname,1), Asc( Left(Nachname,1))*10000
from kugmans
UNION
SELECT "--Leerzeile vor Letter--", Asc( Left(Nachname,1))*10000 -1
FROM kugmans
UNION
Select Distinct nachname, Asc( Left(Nachname,1))*10000 +[FamId]*1000
from kugmans
UNION
SELECT "--Leerzeile vor Fam-- ", Asc( Left(Nachname,1))*10000 +FamID*1000-1
FROM kugmans
) AS x
ORDER BY Sortorder;
...und würde folgenden Output als ResultSet liefern
Displine
--Leerzeile vor Letter--
B
--Leerzeile vor Fam--
Biber
Frank - 01.04.99
--Leerzeile vor Letter--
M
--Leerzeile vor Fam--
Mustermann
Max - 01.12.60
Frieda - 02.03.65
Pubert - 04.05.77
--Leerzeile vor Letter--
P
--Leerzeile vor Fam--
Panzer
Paul - 02.04.65
Friedgunde - 17.11.66
--Leerzeile vor Fam--
Pillemann
Knut - 26.11.69
Gerda - 18.07.66
Die Tabelle heißt bei mir "Kugmans",
die jeweiligen Leerzeilen habe ich hier beim proof-of-concept durch Debug-Text ersetzt,
ebenfalls ergänzt als POC habe ich einen neuen Datensatz mit den Werten FamId 4, LfdNr 1, "Biber", Vorname, Datum.
Eine weitere denkbare Leerzeile wäre z.B mit " UNION SELECT "--Leerzeile nach Fam-- ", Asc( Left(Nachname,1))*10000 +FamID*1000-+1" machbar
ABER: Die Reihenfolge ("sortorder" in der Query) hängt dennoch nur vom Anfangsbuchstaben des Nachnamens + FamId + LfdNr ab, nicht vom Nachnamen selbst.
Grüße
Biber