Zeilen / Zellen vereinen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Zeilen / Zellen vereinen

Beitrag 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
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag 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
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag 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
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag 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
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag 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
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag 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
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Nummerierung in Abfrage

Beitrag 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?
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag 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
lfd_Nummer.jpg (10.1 KiB) 7050 mal betrachtet
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag 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?
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag 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
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag 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?
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag 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
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag 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

Code: Alles auswählen

"Nummerierung" = "Nummerierung"-1
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
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag von Barlee »

...vor dem THEN fehlt eine schließende Klammer....
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

kommentieren

Beitrag von seve »

Kann man bei SQL eigentlich im Code Kommentare einfügen?
Gesperrt