Zeilen / Zellen vereinen
Moderator: Moderatoren
Zeilen / Zellen vereinen
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
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
Hallo seve,
der entscheidende Befehl ist CONCAT. Diesen musst Du in Deine Abfrage einbauen.
Gruß Barlee
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" ))))))
Re: Zeilen / Zellen vereinen
Tschuldige, das war vielleicht etwas missverständlich dargestellt. In meiner Darstellung
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
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.'DerName', 'Vorname1', 'DieAdresse'
'DerName', 'Vorname2', 'DieAdresse'
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
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
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
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
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
Hallo seve,
Diesen Ansatz würde ich verfolgen.
Allerdings bin ich mir nicht sicher, ob man diese SELECT so einbauen kann.
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
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:Mit was für einem Befehl vergleiche ich eine Zeile mit einer darunterliegenden?
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"))), ' ')
Allerdings bin ich mir nicht sicher, ob man diese SELECT so einbauen kann.
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.Wie kopiere ich ziehe ich die Vornamen aus verschiedenen Zeilen in eine neue Spalte zusammen?
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
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:
seh ich nicht wirklich durch; hat auch nicht funktionniert...
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?
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
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
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
Hallo seve,
Darauf aufbauend kann folgende Abfrage das Grundgerüst zur Lösung Deines Problems liefern.
Erinnere Dich an die ersten zwei Punkte meines Vorschlags:
Annahme: Tabelle heißt "Tab_Adresse" und beinhaltet die Spalten "Vorname","Nachname","Adresse". Folglich musst Du die Bezeichner an Deine Tabelle anpassen.
Vielleicht kann Dir das als Arbeitsgrundlage dienen. Viel Erfolg!
Gruß Barlee
Das hatten wir schon, vgl. viewtopic.php?f=8&t=13671&p=54963&hilit ... mer#p54963Oder gibt es sonst eine gute und einfache Lösung, um in einer Abfrage eine Nummerierung einzufügen?
Darauf aufbauend kann folgende Abfrage das Grundgerüst zur Lösung Deines Problems liefern.
Erinnere Dich an die ersten zwei Punkte meines Vorschlags:
Diese sind darin umgesetzt. Darüberhinaus wird eine laufende Nummer als Spalte "lfd" angehängt.-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
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"
Gruß Barlee
Re: Zeilen / Zellen vereinen
Das Vorkommen und die Nummerierung in die Abfrage einzusetzen hat funktionniert, danke. Habs ein klein wenig angepasst, es sieht jetzt so aus:
Leider funktionniert nichts mehr, wenn ich weiterarbeiten will. Schon alleine bei dem einfachen Befehl kommt folgende Fehlermeldung:
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"
Code: Alles auswählen
SELECT * FROM ( *die ganze Geschichte hier reinkopiert* )
Warum dieser Fehler?Die Dateninhalte konnten nicht geladen werden.
Cannot be in ORDER BY clause in statement [ .... ]
Re: Zeilen / Zellen vereinen
Hallo seve,
Gruß Barlee
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.Warum dieser Fehler?
Gruß Barlee
Re: Zeilen / Zellen vereinen
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:
Leider kommt beim ausführen folgende Fehlermeldung:
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"
"SQL-Kommando direkt ausführen" ist aktiviert. Hab ich einen Tippfehler oder einen Konzeptfehler gemacht?SQL-Status: 37000
Fehler-Code: -11
Unexpected token: , in statement [...]
Re: Zeilen / Zellen vereinen
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
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
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:
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
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
Code: Alles auswählen
"Nummerierung" = "Nummerierung"-1
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"
Ich versuchs dann morgen noch mal, vielleicht kommt mir noch eine Idee über Nacht.
Gruss und Danke
Seve
Re: Zeilen / Zellen vereinen
...vor dem THEN fehlt eine schließende Klammer....
kommentieren
Kann man bei SQL eigentlich im Code Kommentare einfügen?