Seite 1 von 2
Zeilen / Zellen vereinen
Verfasst: So, 13.01.2008 18:18
von seve
Hallo,
Ich bin am basteln einer Adressdatenbank für einen Jugend-Verein. Dabei bin ich auf folgendes Problem gestossen:
Man nehme an, eine Tabelle enthalte die Spalten Nachname, Vorname, Adresse. In dem Datensatz gibt es auch Geschwister (dh gleicher Nachname, Adresse). Das sieht dann so aus:
'DerName', 'Vorname1', 'DieAdresse'
'DerName', 'Vorname2', 'DieAdresse'
Nun möchte ich die beiden Zeilen ich in einer Abfrage vereinen (für einen Serienbrief). Dabei sollte die Spalte Vorname immer noch beide Namen beinhalten, getrennt durch ein 'und'.
Das sollte dann so aussehen:
'DerName', 'Vorname1' und 'Vorname2', 'DieAdresse'
Hat jemand eine Idee?
Besten Dank im Voraus
Re: Zeilen / Zellen vereinen
Verfasst: So, 13.01.2008 23:10
von Barlee
Hallo seve,
der entscheidende Befehl ist CONCAT. Diesen musst Du in Deine Abfrage einbauen.
Code: Alles auswählen
CONCAT("DerName", CONCAT(', ',CONCAT("Vorname1",CONCAT(' und ',CONCAT("Vorname2",CONCAT(', ',"DieAdresse" ))))))
Gruß Barlee
Re: Zeilen / Zellen vereinen
Verfasst: Mo, 14.01.2008 16:23
von seve
Tschuldige, das war vielleicht etwas missverständlich dargestellt. In meiner Darstellung
'DerName', 'Vorname1', 'DieAdresse'
'DerName', 'Vorname2', 'DieAdresse'
stellen die Kommas die Trennung zwischen den Spalten dar. 'Vorname1' und 'Vorname2' sind also Beispiel-Vornamen in der gleichen Spalte, nämlich in der Spalte Vorname.
Also funktionniert der CONCAT-Befehl also nicht; der vereint (meines wissens) verschiedene Spalten miteinander. Das brauch ich in dem Falle nicht...
Ein Problem bei mir ist natürlich noch, dass es in meiner Tabelle natürlich nicht alle Geschwister sind, also den gleichen Nachnamen und Adresse haben. Also sollten je nach dem mehrere Zeilen zu einer zusammengefasst werden, andere Zeilen sollen einfach so bleiben, wie sie sind.
Ich hatte die Idee, das Ganze mit GROUP BY anzustellen; habs dann mit den Vornamen nicht hingekriegt...
Gruss
Seve
Re: Zeilen / Zellen vereinen
Verfasst: Mo, 14.01.2008 21:20
von Barlee
Hallo seve,
ok, verstehe.
Die Umsetzung dürfte ein wenig aufwendiger sein, könnte aber folgendermaßen funktionieren:
-Datensätze nach gleichen Kriterien (Name, Adresse) sortieren lassen. Geschwister stehen dann in benachbarten Zeilen
-jeweiliges Vorkommen (Anzahl) von gleichen Nachnamen & Adressen in extra Spalte berechnen lassen
-wenn Vorkommen = 2,
vergleiche, ob Name, Adresse in Vorgängerzeile identisch mit aktueller Zeile,
>> wenn identisch, dann ziehe Vornamen aus aktueller und Vorgängerzeile in extra Spalte 'Vorname_Gesamt' zusammen
>> wenn nicht identisch, dann vergleiche mit Nachfolgerzeile und ziehe Vornamen aus aktueller und Nachfolgerzeile in extra Spalte 'Vorname_Gesamt' zusammen
-wenn Vorkommen = 1
>> Vorname in extra Spalte entspricht Vornamen der akt. Zeile, da Kind ohne Geschwister
-wenn Vorkommen = 3
>> wie Vorkommen = 2, allerdings mit Prüfung der zwei Vorgänger- und Nachfolgezeilen
-letztendlich ein SELECT über die Spalten 'Vorname_Gesamt' , Name, Adresse
Gruß Barlee
Re: Zeilen / Zellen vereinen
Verfasst: Mi, 16.01.2008 23:11
von seve
Hallo,
Danke erstmal für die Antwort.
Sorry, ich bin noch kein Experte in Sachen Base und SQL. Also, zwei Fragen:
- Mit was für einem Befehl vergleiche ich eine Zeile mit einer darunterliegenden?
- Wie kopiere ich ziehe ich die Vornamen aus verschiedenen Zeilen in eine neue Spalte zusammen?
Danke und Gruss
Re: Zeilen / Zellen vereinen
Verfasst: Do, 17.01.2008 20:41
von Barlee
Hallo seve,
Mit was für einem Befehl vergleiche ich eine Zeile mit einer darunterliegenden?
Einen einzelnen Befehl gibt es da nicht. Evtl. könnte man mit einer Zeilennummerierung arbeiten. D.h. man gibt in der Abfrage jedem (sortierten) Datensatz eine fortlaufende Nummer, z.B. "Zähler". Den Vornamen der Vorgängerzeile könnte man dann abfragen, indem man den Datensatz mit Zähler-1 lokalisiert, also
theoretisch:
Code: Alles auswählen
...CASEWHEN("Vorname"=(SELECT "Vorname" FROM ["Tabelle"] WHERE "Zähler" = "Zähler"-1),CONCAT("Vorname",CONCAT(', ',(SELECT "Vorname" FROM ["Tabelle"] WHERE "Zähler" = "Zähler-1"))), ' ')
Diesen Ansatz würde ich verfolgen.
Allerdings bin ich mir nicht sicher, ob man diese SELECT so einbauen kann.
Wie kopiere ich ziehe ich die Vornamen aus verschiedenen Zeilen in eine neue Spalte zusammen?
Das könnte geschehen wie im obigen Beispiel. Das CONCAT verbindet den Vornamen der akt. Zeile mit dem Ergebnis der (Unter)abfrage auf die vorherige Zeile.
Das ist meine Idee. Ich habe sie bisher nicht getestet. Aber vielleicht gibt es noch den einen oder anderen Benutzer hier im Forum mit weiteren Anregungen zu dieser Aufgabenstellung.
Gruß Barlee
Nummerierung in Abfrage
Verfasst: Fr, 18.01.2008 16:50
von seve
Danke, die Idee klingt irgendwie logisch. Leider bin ich schon sehr bald mit der Umsetzung gescheitert. Ich kriegte den Zähler nicht hin.
Ich hab etwas gegoogelt und bin auf verschiedene Ideen / Befehle gestossen:
Code: Alles auswählen
SET @zaehler = 0;
SELECT Vorname, Nachname, (@zaehler := @zaehler + 1) as Nummerierung FROM Tabelle
seh ich nicht wirklich durch; hat auch nicht funktionniert...
Code: Alles auswählen
SELECT
IDENTITY(INT,1,1) AS Nummerierung
, Nachname
, Vorname
, Adresse
INTO #Tabelle
FROM Tabelle
ORDER BY Nachname, Adresse
SELECT *
FROM #Tabelle
ORDER BY Nummerierung
DROP TABLE #Tabelle
klingt irgendwie sinnvoll, funktionniert. Ist ein Syntax-Fehler dabei? Oder geht so was mit Base nicht?
Dann hab ich noch den Befehl ROW_NUMBER (oder so). Sieht sehr simpel aus. Funktionniert der in Base? Und wie baut man den in eine Abfrage ein?
Oder gibt es sonst eine gute und einfache Lösung, um in einer Abfrage eine Nummerierung einzufügen?
Re: Zeilen / Zellen vereinen
Verfasst: Sa, 19.01.2008 13:33
von Barlee
Hallo seve,
Oder gibt es sonst eine gute und einfache Lösung, um in einer Abfrage eine Nummerierung einzufügen?
Das hatten wir schon, vgl.
viewtopic.php?f=8&t=13671&p=54963&hilit ... mer#p54963
Darauf aufbauend kann folgende Abfrage das
Grundgerüst zur Lösung Deines Problems liefern.
Erinnere Dich an die ersten zwei Punkte meines Vorschlags:
-Datensätze nach gleichen Kriterien (Name, Adresse) sortieren lassen. Geschwister stehen dann in benachbarten Zeilen
-jeweiliges Vorkommen (Anzahl) von gleichen Nachnamen & Adressen in extra Spalte berechnen lassen
Diese sind darin umgesetzt.
Darüberhinaus wird eine laufende Nummer als Spalte "lfd" angehängt.
Annahme: Tabelle heißt "Tab_Adresse" und beinhaltet die Spalten "Vorname","Nachname","Adresse". Folglich musst Du die Bezeichner an Deine Tabelle anpassen.
Code: Alles auswählen
SELECT
"b"."ID",
"b"."Vorname",
"b"."Nachname",
"b"."Adresse",
(SELECT COUNT( CONCAT( "a"."Nachname", "a"."Adresse" ) ) FROM "Tab_Adresse" "a"
WHERE CONCAT( "a"."Nachname", "a"."Adresse" ) = CONCAT( "b"."Nachname", "b"."Adresse" ) ) AS "Vorkommen",
(SELECT COUNT( * ) FROM "Tab_Adresse" AS "X" WHERE (CONCAT("X"."Nachname",CONCAT("X"."Adresse","X"."Vorname"))) < CONCAT("b"."Nachname",CONCAT("b"."Adresse","b"."Vorname") ) )+ 1 AS "lfd"
FROM
(
SELECT * from "Tab_Adresse" "a"
)"b"
ORDER BY "b"."Nachname", "b"."Adresse","b"."Vorname"
Vielleicht kann Dir das als Arbeitsgrundlage dienen. Viel Erfolg!
Gruß Barlee

- lfd_Nummer.jpg (10.1 KiB) 7069 mal betrachtet
Re: Zeilen / Zellen vereinen
Verfasst: So, 20.01.2008 17:33
von seve
Das Vorkommen und die Nummerierung in die Abfrage einzusetzen hat funktionniert, danke. Habs ein klein wenig angepasst, es sieht jetzt so aus:
Code: Alles auswählen
SELECT
"b"."Vorname",
"b"."Nachname",
"b"."Adresse",
(SELECT COUNT( CONCAT( "a"."Nachname", "a"."Adresse" ) ) FROM "Tab_Adresse" AS "a"
WHERE CONCAT( "a"."Nachname", "a"."Adresse" ) =
CONCAT( "b"."Nachname", "b"."Adresse" ) ) AS "Vorkommen",
(SELECT COUNT( * ) FROM "Tab_Adresse" AS "X"
WHERE (CONCAT("X"."Nachname",CONCAT("X"."Adresse","X"."Vorname"))) <
CONCAT("b"."Nachname",CONCAT("b"."Adresse","b"."Vorname") ) )+ 1 AS "Nummerierung"
FROM (
SELECT * from "Tab_Adresse" AS "a"
) AS "b"
ORDER BY "b"."Nachname", "b"."Adresse","b"."Vorname"
Leider funktionniert nichts mehr, wenn ich weiterarbeiten will. Schon alleine bei dem einfachen Befehl
Code: Alles auswählen
SELECT * FROM ( *die ganze Geschichte hier reinkopiert* )
kommt folgende Fehlermeldung:
Die Dateninhalte konnten nicht geladen werden.
Cannot be in ORDER BY clause in statement [ .... ]
Warum dieser Fehler?
Re: Zeilen / Zellen vereinen
Verfasst: So, 20.01.2008 17:42
von Barlee
Hallo seve,
Warum dieser Fehler?
Weil Du noch ein SELECT "um die ganze Geschichte" gemacht hast. In solchem Fall musst Du die ORDER BY Klausel wieder nach außen setzen. Also hinter die letzte Klammer.
Gruß Barlee
Re: Zeilen / Zellen vereinen
Verfasst: So, 20.01.2008 17:47
von seve
Hab mich noch etwas mit dem CASEWHEN versucht.
Dafür habe ich eine neue Tabelle "Tab_Adresse2" gemacht, quasi eine Versuchstabelle. Enthalten sind die Tabellen Nachname, Vorname, Adresse, Vorkommen, Nummerierung (analog zur obenstehenden Abfrage).
Habe folgenden Code zusammengebastelt:
Code: Alles auswählen
SELECT
"Nachname",
CASE
WHEN
("Vorname" = ( SELECT "Vorname" FROM "Tab_Adresse2" WHERE "Nummerierung" = "Nummerierung"-1)
, CONCAT ("Vorname", CONCAT (', ', ( SELECT "Vorname" FROM "Tab_Adresse2" WHERE "Nummerierung" = "Nummerierung-1"))), ' ')
ELSE "Vorname"
END as "VornameNeu",
"Adresse"
FROM
"Tab_Adresse2"
Leider kommt beim ausführen folgende Fehlermeldung:
SQL-Status: 37000
Fehler-Code: -11
Unexpected token: , in statement [...]
"SQL-Kommando direkt ausführen" ist aktiviert. Hab ich einen Tippfehler oder einen Konzeptfehler gemacht?
Re: Zeilen / Zellen vereinen
Verfasst: So, 20.01.2008 18:04
von Barlee
zwei kleine Fehler:
1)
überprüfe mal Deinen CONCAT Befehl. Im zweiten möchtest Du mehr als zwei Zeichenketten zusammenfügen -- das funktioniert nicht.
2)
CASE WHEN THEN -- statt THEN hast Du ein Komma
Gruß Barlee
Re: Zeilen / Zellen vereinen
Verfasst: So, 20.01.2008 18:25
von seve
Das mit dem SELECT über die ganze Geschichte hat funktionniert, danke.
Ich hab das mit dem CONCAT (glaub ich) berichtigt. Weiter hatte es noch ein paar Klammer-Fehler drin. Es hat leider immer noch nicht funktionniert.
Ich hab also gedacht, vielleicht geht das mit dem
nicht, der einen "Nummerierung" einen anderen Namen gegeben. Meine Abfrage sieht jetzt so aus:
Code: Alles auswählen
SELECT
"Nachname",
CASE
WHEN
("Vorname" = ( SELECT "Vorname" FROM "Tab_Adresse2" AS "n" WHERE "Nummerierung" = "n"."Nummerierung"-1)
THEN
CONCAT ( "Vorname", CONCAT ( ( SELECT "Vorname" FROM "Tab_Adresse2" AS "n" WHERE "Nummerierung" = "n"."Nummerierung"-1), ' '))
ELSE "Vorname"
END as "VornameNeu",
"Adresse"
FROM
"Tab_Adresse2"
Gehen tuts leider immer noch nicht, "Unexpected token: THEN in statement". Bringt das mit dem * AS "n" * überhaupt was?
Ich versuchs dann morgen noch mal, vielleicht kommt mir noch eine Idee über Nacht.
Gruss und Danke
Seve
Re: Zeilen / Zellen vereinen
Verfasst: So, 20.01.2008 18:30
von Barlee
...vor dem THEN fehlt eine schließende Klammer....
kommentieren
Verfasst: Mo, 21.01.2008 11:37
von seve
Kann man bei SQL eigentlich im Code Kommentare einfügen?