Zeilen / Zellen vereinen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

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

Re: Zeilen / Zellen vereinen

Beitrag von seve »

Yuuhuuu! Ich bin einen Schritt weitergekommen...

Man habe folgende Tabelle:
1.png
1.png (5.44 KiB) 1613 mal betrachtet
Darauf habe ich folgende Abfrage:

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"
Ich hab jetzt also alle Einträge sortiert nach Nachname und Adresse, mit Nummerierung. Diese hab ich dann als Ansicht "Tab_Adresse2" gespeichert.
2.png
2.png (6.29 KiB) 1614 mal betrachtet
Darauf wiederum habe ich folgende Abfrage:

Code: Alles auswählen

SELECT DISTINCT
"n"."Nachname",
CASE
	WHEN 
		"Vorkommen" = '1'
	THEN	
		"n"."Vorname"
	WHEN 
		"Vorkommen" = '2'
		AND "n"."Nummerierung" = "m"."Nummerierung"-1
		AND CONCAT( "n"."Nachname", "n"."Adresse" ) =
				CONCAT( "m"."Nachname", "m"."Adresse" )
	THEN	
		CONCAT( "n"."Vorname",
			CONCAT( ' und ' ,
			SELECT "o"."Vorname" FROM "Tab_Adresse2" AS "o" WHERE "n"."Nummerierung" = "o"."Nummerierung"-1))
	WHEN 
		"Vorkommen" = '3'
		AND "n"."Nummerierung" = "m"."Nummerierung"-1
		AND "n"."Nummerierung" = "p"."Nummerierung"-2
		AND CONCAT( "n"."Nachname", "n"."Adresse" ) = CONCAT( "m"."Nachname", "m"."Adresse" )
		AND CONCAT( "m"."Nachname", "m"."Adresse" ) = CONCAT( "p"."Nachname", "p"."Adresse" )
		AND CONCAT( "p"."Nachname", "p"."Adresse" ) = CONCAT( "n"."Nachname", "n"."Adresse" )
	THEN	
		CONCAT( "n"."Vorname",
		CONCAT( ' und ' ,	
		CONCAT( SELECT "q"."Vorname" FROM "Tab_Adresse2" AS "q" WHERE "n"."Nummerierung" = "q"."Nummerierung"-1 ,
		CONCAT( ' und ' ,
		SELECT "w"."Vorname" FROM "Tab_Adresse2" AS "w" WHERE "n"."Nummerierung" = "w"."Nummerierung"-2
			))))
	WHEN 
		"Vorkommen" > '3'
	THEN	
		'Familie'
	ELSE
		''
END AS "Vorname"
,"n"."Adresse"
FROM
"Tab_Adresse2" AS "n", "Tab_Adresse2" AS "m", "Tab_Adresse2" AS "p"
WHERE "Vorname" <> ''
Das liefert mir jetzt das gewünschte Ergebnis...
3.png
3.png (6.16 KiB) 1613 mal betrachtet
Nun möcht die beiden Abfragen noch kombinieren, so also, dass ich keine Ansicht speichern muss. Da die "Tab_Adresse" mehrmals in der zweiten Abfrage vorkommt, müsste ich die erste Abfrage also auch mehrmals dort hineinkopieren.
Gibt es keinen Weg, so à la

Code: Alles auswählen

...WHERE ( *die erste Abfrage* ) AS "Tab_Adresse2"
, dass ich den Code der ersten Abfrage nur einmal in die zweite einfügen muss?
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Beitrag von Barlee »

Hallo seve,

geht doch voran ... gut umgesetzt!
Kann man bei SQL eigentlich im Code Kommentare einfügen?
Stelle einmal zwei Bindestriche voran. Funktioniert solange "SQL direkt ausführen" aktiviert ist.
dass ich den Code der ersten Abfrage nur einmal in die zweite einfügen muss?
Ich befürchte es geht in diesem Fall nicht. Aber was spricht aus Deiner Sicht gegen die Nutzung eines Views? In diesem Fall doch mehr als sinnvoll.

Ich habe die Abfrage auch einmal erstellt. Auf anderem Weg.
Zum Vergleich nochmal mein Ergebnis. Mit folgender Abfrage greife ich auf den View Tab_Adresse_V zu:
(die Formatierung wird komischerweise hier im Codefenster immer durcheinander geworfen -- ich lasse es mal so ..)

Code: Alles auswählen

SELECT 
"Nachname",
"VornameNeu",
"Adresse"

 FROM
(
SELECT
"Vorname",
"lfd",

CASE
WHEN "Vorkommen" = 1  THEN "Vorname"
WHEN "Vorkommen" = 2  THEN CASE
WHEN ("Nachname"+"Adresse" = ( SELECT "Nachname"+"Adresse" FROM "Tab_Adresse_V" as "X" WHERE "X"."lfd" = 
"Tab_Adresse_V"."lfd"-1) ) 
THEN CONCAT (( SELECT "Vorname" FROM "Tab_Adresse_V" as "X" WHERE "X"."lfd" = "Tab_Adresse_V"."lfd"-1), CONCAT (',',"Vorname"))
ELSE ''
END
WHEN "Vorkommen" = 3  THEN  
CASE
WHEN ("Nachname"+"Adresse" = ( SELECT "Nachname"+"Adresse" FROM "Tab_Adresse_V" as "X" WHERE "X"."lfd" = "Tab_Adresse_V"."lfd"-1) AND "Nachname"+"Adresse" = (SELECT "Nachname"+"Adresse" FROM "Tab_Adresse_V" as "X" WHERE "X"."lfd" = "Tab_Adresse_V"."lfd"-2) ) 
THEN CONCAT (( SELECT "Vorname" FROM "Tab_Adresse_V" as "X" WHERE "X"."lfd" = "Tab_Adresse_V"."lfd"-2), CONCAT (',',CONCAT(( SELECT "Vorname" FROM "Tab_Adresse_V" as 	"X" WHERE "X"."lfd" ="Tab_Adresse_V"."lfd"-1),CONCAT(', ',"Vorname" ))))
ELSE ''
END
ELSE "Vorname"
END as "VornameNeu",
"Nachname",
"Adresse"

FROM
"Tab_Adresse_V"
)"a"

where "a"."VornameNeu" != ''
Adressen1.jpg
Adressen1.jpg (17.23 KiB) 1593 mal betrachtet
...und nach dem äußeren SELECT
Adressen.jpg
Adressen.jpg (10.66 KiB) 1592 mal betrachtet
Gruß Barlee
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag von seve »

Hallo,
Auch eine gute Möglichkeit, wobei sie ja ähnlich ist. Die Idee bei mir stammt ja auch von dir :)

Das mit den Kommentaren funktionniert, danke.


Was für mich gegen eine View spricht? In meinem Verein gibt es verschiedene Sektionen und Gruppen, die manchmal einzeln angeschrieben werden müssen. Auch hier gibt es Geschwister...
Wenn ich also auch dort die Geschwister zusammenfassen will, muss ich für jede Gruppe und/oder Sektion ein neues View erstellen. Und das möcht ich nicht, respektive ist sehr aufwändig.
Weiter muss man die Quelltabelle ggf. nur an einem Ort ändern. Oder kann dort auch ein SELECT einfügen.
Ausserdem find ich die View nicht ästhetisch...

Nun, ich hatte die Idee, das ungefähr so zu machen:

Code: Alles auswählen

CREATE TABLE "TempTable"
	("Nummerierung" int Identity(1, 1) Primary Key,
	"Nachname" varchar(50),
	"Vorname" varchar(50),
	"Adresse" varchar(50)	
),

INSERT INTO "TempTable"
	"Nachname", "Vorname", "Adresse" FROM "Tab_Adresse" ORDER BY "Nachname", "Adresse"

SELECT ..... hier kommt meine Abfrage, welche die Vornamen zusammenfasst...... ,

DROP TABLE "TempTable"
Allerdings habe ich überhaupt keine Ahnung, was diese Syntax angeht. Kann Base sowas überhaupt? Kann man das einfach in eine Abfrage einfügen?

Lg seve
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag von Barlee »

Hallo seve,
Wenn ich also auch dort die Geschwister zusammenfassen will, muss ich für jede Gruppe und/oder Sektion ein neues View erstellen. Und das möcht ich nicht, respektive ist sehr aufwändig.
Musst Du nicht zwangsläufig. Du könntest Informationen zu Sektionen und Gruppenzugehörigkeit doch bereits in die Ursprungstabelle (die Du im View ja auch abfragst) mit aufnehmen. Folglich müsstest Du sie dann in der Sortierung berücksichtigen um sicherzustellen, dass die Geschwister wieder in benachbarten Zeilen stehen.
Daraus erstellst Du einen neuen View. Dieser löst den alten ab, beinhaltet aber jetzt auch die Infos zu Gruppen und Sektionen. Fragst Du diesen jetzt ab, könntest Du z.B. mit einer Parameterabfrage http://www.ooowiki.de/ParameterAbfrage einschränkende Bedingungen festlegen. Bei der Abfrage erscheint dann ein Fenster, in das Du die Filterkriterien eingibst. Somit bist Du frei in der Entscheidung, ob Du alle Einträge des Views anzeigen lassen möchtest, oder bspw. nur welche, die zu Sektion "B" gehören.

Aber zu Deiner Idee:
Nun, ich hatte die Idee, das ungefähr so zu machen:

Code: Alles auswählen
CREATE TABLE "TempTable"
("Nummerierung" int Identity(1, 1) Primary Key,
"Nachname" varchar(50),
"Vorname" varchar(50),
"Adresse" varchar(50)
),

INSERT INTO "TempTable"
"Nachname", "Vorname", "Adresse" FROM "Tab_Adresse" ORDER BY "Nachname", "Adresse"

SELECT ..... hier kommt meine Abfrage, welche die Vornamen zusammenfasst...... ,

DROP TABLE "TempTable"
Kann Base sowas überhaupt?
Ja!!
Diese (Verwaltungs)befehle kannst Du unter Extras/SQL absetzen. Allerdings ist hier irgendetwas durcheinander:

Code: Alles auswählen

INSERT INTO "TempTable"
   "Nachname", "Vorname", "Adresse" FROM "Tab_Adresse" ORDER BY "Nachname", "Adresse"

SELECT ..... hier kommt meine Abfrage, welche die Vornamen zusammenfasst...... ,
Das SELECT sollte nach oben, weil Du darüber ja auswählst was eingefügt werden soll, also:

Code: Alles auswählen

INSERT INTO "TempTable" ("Nachname","Vorname","Adresse")
SELECT "Nachname", "Vorname", "Adresse" FROM "Tab_Adresse" ORDER BY "Nachname", "Adresse"
Gruß Barlee
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag von seve »

Hallo,

Ich hab jetzt also etwas rumgespielt mit Extras->SQL. Ich habe mir jetzt also die Befehle zurechtgebastelt.
Der folgende Code Liefert mir aus der Quelltabelle das gewünschte Ergebnis in die Tabelle "TempTable3". (Ist ein etwas grosses Ding...)

Code: Alles auswählen

CREATE TABLE "TempTable1"
("Nachname" varchar(50),
"Vorname" varchar(50),
"Adresse" varchar(50)
)

INSERT INTO "TempTable1" ("Nachname","Vorname","Adresse")
	SELECT "Nachname", "Vorname", "Adresse" FROM
--Quelle definieren: Hier kann die Quelltabelle definiert werden oder auch eine Abfrage eingefügt werden.
		"Tab_Adresse"
--Ende Quelle definieren
	ORDER BY "Nachname", "Adresse"


CREATE TABLE "TempTable2"
("Nachname" varchar(50),
"Vorname" varchar(50),
"Adresse" varchar(50),
"Vorkommen" Int,
"Nummerierung" BigInt
)

INSERT INTO "TempTable2" ("Nachname","Vorname","Adresse", "Vorkommen", "Nummerierung")
	SELECT
	"b"."Nachname",
	"b"."Vorname",
	"b"."Adresse",
	(SELECT COUNT( CONCAT( "a"."Nachname", "a"."Adresse" ) ) FROM "TempTable1" AS "a"
		WHERE CONCAT( "a"."Nachname", "a"."Adresse" ) =
		CONCAT( "b"."Nachname", "b"."Adresse" ) ) AS "Vorkommen",
	(SELECT COUNT( * ) FROM "TempTable1" 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 "TempTable1" AS "a"
	) AS "b"
	ORDER BY "b"."Nachname", "b"."Adresse","b"."Vorname"


CREATE TABLE "TempTable3"
("Nachname" varchar(50),
"Vorname" varchar(50),
"Adresse" varchar(50)
)

INSERT INTO "TempTable3" ("Nachname","Vorname","Adresse")
SELECT DISTINCT
"n"."Nachname",
CASE
	WHEN 
		"Vorkommen" = '1'
	THEN	
		"n"."Vorname"
	WHEN 
		"Vorkommen" = '2'
		AND "n"."Nummerierung" = "m"."Nummerierung"-1
		AND CONCAT( "n"."Nachname", "n"."Adresse" ) =
				CONCAT( "m"."Nachname", "m"."Adresse" )

	THEN	
		CONCAT( "n"."Vorname",
			CONCAT( ' und ' ,
			SELECT "o"."Vorname" FROM "TempTable2" AS "o" WHERE "n"."Nummerierung" = "o"."Nummerierung"-1))
	WHEN 
		"Vorkommen" = '3'
		AND "n"."Nummerierung" = "m"."Nummerierung"-1
		AND "n"."Nummerierung" = "p"."Nummerierung"-2
		AND CONCAT( "n"."Nachname", "n"."Adresse" ) = CONCAT( "m"."Nachname", "m"."Adresse" )
		AND CONCAT( "m"."Nachname", "m"."Adresse" ) = CONCAT( "p"."Nachname", "p"."Adresse" )
		AND CONCAT( "p"."Nachname", "p"."Adresse" ) = CONCAT( "n"."Nachname", "n"."Adresse" )
	THEN	
		CONCAT( "n"."Vorname",
		CONCAT( ' und ' ,	
		CONCAT( SELECT "q"."Vorname" FROM "TempTable2" AS "q" WHERE "n"."Nummerierung" = "q"."Nummerierung"-1 ,
		CONCAT( ' und ' ,
		SELECT "w"."Vorname" FROM "TempTable2" AS "w" WHERE "n"."Nummerierung" = "w"."Nummerierung"-2
			))))
	WHEN 
		"Vorkommen" > '3'
	THEN	
		'Familie'
	ELSE
		'Das ist ein ungültiger Hund!'
END AS "Vorname"
,"n"."Adresse"
FROM
"TempTable2" AS "n", "TempTable2" AS "m", "TempTable2" AS "p"
WHERE "Vorname" <> 'Das ist ein ungültiger Hund!'
Nun kann ich eine Abfrage machen mit

Code: Alles auswählen

SELECT * FROM "TempTable3"
und anschliessend wieder Extras->SQL folgendes eingeben:

Code: Alles auswählen

DROP TABLE "TempTable1"
DROP TABLE "TempTable2"
DROP TABLE "TempTable3"
Nun möchte ich die drei Schritte irgendwie zusammengefasst als eine Abfrage speichern. Geht das?

Gruss und Danke
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Zeilen / Zellen vereinen

Beitrag von Toxitom »

Hey seve,
Kann man bei SQL eigentlich im Code Kommentare einfügen?
Man kann - nicht jedoch in einer einzelnen Anweisung! SQL Text kann ja als eigene Textdatei abgelegt weren, dort kannst du natürlich kommentare unterbringen (Zeilen, die der SQL Interpreter ignoriert).
Nur - wie gesagt - in einer einzelnen Anweisung wie Base sie nutzt geht das nicht.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag von Barlee »

Hallo seve,
Nun möchte ich die drei Schritte irgendwie zusammengefasst als eine Abfrage speichern. Geht das?
Wenn Du CREATE, INSERT, SELECT, DROP der Reihe nach ausführen möchtest, kannst Du diese Befehlsschritte in einem SQL Script speichern. So ein Script lässt sich anscheinend im HSQLDB Manager ausführen. Hier ein Testscript daraus:
SQL_SCRIPT.jpg
SQL_SCRIPT.jpg (9.94 KiB) 1485 mal betrachtet
Du könntest auch versuchen, alle diese Befehle hintereinander -mit Semikolon getrennt- in das SQL Fenster unter Extras/SQL einzukopieren und "in einem Rutsch" auszuführen. Speichern kannst Du dann aber nichts.
-------
Da Du ja ohnehin "Pseudo"-Temptabellen erstellst, ist für Dich evtl. die Thematik der temporären Tabellen interessant?
z.B. würden folgenden Befehle, im SQL Fenster ausgeführt,
-die temp. Tabelle "TEMP_TABLE" löschen, falls diese existiert
-die Tabelle "Tab_Adresse" abfragen und das Ergebnis in eine "echte" temporäre Tabelle "TEMP_TABLE" packen
-das Abfrageergebnis der temporären Tabelle in die Tabelle "ERGEBNIS" schreiben

Code: Alles auswählen

DROP TABLE "TEMP_TABLE" IF EXISTS;

SELECT * INTO TEMP "TEMP_TABLE"
FROM "Tab_Adresse";

SELECT * INTO "ERGEBNIS" FROM "TEMP_TABLE" 
Vielleicht ja für Dich anwendbar...

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

Re: Zeilen / Zellen vereinen

Beitrag von seve »

An Thomas:
Mit den Kommentaren funktionnierts bei mir jetzt, ich habe zu beginn der Zeile zwei Bindestriche gesetzt (und die Option "SQL direkt ausführen" aktiviert).

An Barlee
Extras/SQL einzukopieren und "in einem Rutsch" auszuführen
das funktionniert bestens.
Das mit den temporären Tables funzt bei mir nicht; aber es geht auch andesrum.
Speichern kannst Du dann aber nichts.
Nach dem suchte ich, schade, gehts nicht... Wäre mir am liebsten gewesen, wenn ich das in eine Abfrage hätte integrieren können

HSQLDB Manager, kenn ich nicht. Gehört das zu OpenOffice?


Da ich die SQL-Befehle nicht speichern kann, werds ich wahrscheinlich doch mit einem View oder so lösen...

Gruss
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag von Barlee »

HSQLDB Manager, kenn ich nicht. Gehört das zu OpenOffice?
Ich nehme es an. Auf meinem Rechner befindet er sich unter Dienstkonfiguration / hsqldb Database Engine.
werds ich wahrscheinlich doch mit einem View oder so lösen...
.. das wäre auch meine Empfehlung. Hatte ich ja schon geschrieben. Viel Erfolg!

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

Re: Zeilen / Zellen vereinen

Beitrag von seve »

Hallo,
Nachfolgend meine Codes. Ich habe die Quell-Tabelle noch etwas ausgebaut, daher etwas komplizierter.

Code: Alles auswählen

				SELECT
				"b"."Nachname", "b"."Vorname", "b"."Strasse", "b"."Nr", "b"."PLZ", "b"."Ort",

				(SELECT COUNT( CONCAT( "a"."Nachname", CONCAT("a"."Strasse", CONCAT( "a"."Nr", CONCAT( "a"."PLZ", "a"."Ort" ))))  ) FROM 
							--Quelle definieren
							(SELECT * FROM "Kontakte" WHERE "Kategorie" = '1' AND "aktiv" = 'true')
							-- Ende Quelle definieren
					AS "a"
					WHERE CONCAT( "a"."Nachname", CONCAT("a"."Strasse", CONCAT( "a"."Nr", CONCAT( "a"."PLZ", "a"."Ort" )))) =
					CONCAT( "b"."Nachname", CONCAT("b"."Strasse", CONCAT( "b"."Nr", CONCAT( "b"."PLZ", "b"."Ort" )))) )
				AS "Vorkommen",

				(SELECT COUNT( * ) FROM
							--Quelle definieren
							(SELECT * FROM "Kontakte" WHERE "Kategorie" = '1' AND "aktiv" = 'true')
							-- Ende Quelle definieren
					AS "X"
					WHERE CONCAT( "X"."Nachname", CONCAT("X"."Strasse", CONCAT( "X"."Nr", CONCAT( "X"."PLZ", CONCAT("X"."Ort", "X"."Vorname" )))))  <
					CONCAT( "b"."Nachname", CONCAT("b"."Strasse", CONCAT( "b"."Nr", CONCAT( "b"."PLZ", CONCAT("b"."Ort", "b"."Vorname" ))))) + 1)
				AS "Nummerierung"

				FROM (
				SELECT  * FROM 
							--Quelle definieren
							(SELECT * FROM "Kontakte" WHERE "Kategorie" = '1' AND "aktiv" = 'true')
							-- Ende Quelle definieren
				AS "a"
				) AS "b" ORDER BY "Nachname", "Strasse", "Nr", "PLZ", "Ort", "Vorname"
diese als view speichern und dann

Code: Alles auswählen

-- Beginn "Kontakte mit gleichem Nachname, Adresse zusammenfassen"
SELECT DISTINCT
"n"."Nachname",
CASE
	WHEN 
		"Vorkommen" = '1'
	THEN	
		"n"."Vorname"
	WHEN 
		"Vorkommen" = '2'
		AND "n"."Nummerierung" = "m"."Nummerierung"-1
		AND CONCAT( "n"."Nachname", CONCAT("n"."Strasse", CONCAT( "n"."Nr", CONCAT( "n"."PLZ", "n"."Ort" )))) =
				CONCAT( "m"."Nachname", CONCAT("m"."Strasse", CONCAT( "m"."Nr", CONCAT( "m"."PLZ", "m"."Ort" ))))
	THEN	
		CONCAT( "n"."Vorname",
			CONCAT( ' und ' ,
			SELECT "o"."Vorname" FROM "Tab_Adresse2" AS "o" WHERE "n"."Nummerierung" = "o"."Nummerierung"-1))
	WHEN 
		"Vorkommen" = '3'
		AND "n"."Nummerierung" = "m"."Nummerierung"-1
		AND "n"."Nummerierung" = "p"."Nummerierung"-2
		AND CONCAT( "n"."Nachname", CONCAT("n"."Strasse", CONCAT( "n"."Nr", CONCAT( "n"."PLZ", "n"."Ort" ))))
			= CONCAT( "m"."Nachname", CONCAT("m"."Strasse", CONCAT( "m"."Nr", CONCAT( "m"."PLZ", "m"."Ort" ))))
		AND CONCAT( "m"."Nachname", CONCAT("m"."Strasse", CONCAT( "m"."Nr", CONCAT( "m"."PLZ", "m"."Ort" ))))
			= CONCAT( "p"."Nachname", CONCAT("p"."Strasse", CONCAT( "p"."Nr", CONCAT( "p"."PLZ", "p"."Ort" ))))
		AND CONCAT( "p"."Nachname", CONCAT("p"."Strasse", CONCAT( "p"."Nr", CONCAT( "p"."PLZ", "p"."Ort" ))))
			= CONCAT( "n"."Nachname", CONCAT("n"."Strasse", CONCAT( "n"."Nr", CONCAT( "n"."PLZ", "n"."Ort" ))))
	THEN	
		CONCAT( "n"."Vorname",
		CONCAT( ' und ' ,	
		CONCAT( SELECT "q"."Vorname" FROM "Tab_Adresse2" AS "q" WHERE "n"."Nummerierung" = "q"."Nummerierung"-1 ,
		CONCAT( ' und ' ,
		SELECT "w"."Vorname" FROM "Tab_Adresse2" AS "w" WHERE "n"."Nummerierung" = "w"."Nummerierung"-2
			))))
	WHEN 
		"Vorkommen" > '3'
	THEN	
		'Familie'
	ELSE
		'Das ist ein ungültiger Hund!'
END AS "Vorname"
,"n"."Strasse"
,"n"."Nr"
,"n"."PLZ"
,"n"."Ort"
FROM
"Tab_Adresse2" AS "n", "Tab_Adresse2" AS "m", "Tab_Adresse2" AS "p"
WHERE "Vorname" <> 'Das ist ein ungültiger Hund!'
-- Ende "Kontakte mit gleichem Nachname, Adresse zusammenfassen"
Wie ihr vielleicht schon gemerkt habt, mag ich die Views nicht besonders. Ich hab also versucht, den ersten Code in den zweiten reinzukopieren. Etwas unschön, da es ca 6 mal sind, tja...
Ich bin dabei auf das Problem mit ODRER BY gestossen. Dieser Befehl muss ja am Ende des ersten SELECT's stehen. Ich hab es also ganz am Schluss eingesetzt.
Das hat dann aber nicht geklappt; "ORDER BY item shoult be in the SELECT DISTINCT list" Wenn ich das DISTINCT lösche, gehts; dann zeigts die Einträge aber x-mal an.

Hat jemand eine Idee?
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Zeilen / Zellen vereinen

Beitrag von Barlee »

Hallo seve,
Hat jemand eine Idee?
Du versuchst nach Spalten zu sortieren, die nicht Ergebnis des SELECT DISTINCT sind.
In folgendem Beispiel soll nach "Ein_Kto" sortiert werden. Die Ergebnistabelle nach Ausführung des SELECT DISTINCT beinhaltet aber nur die Spalten "ID" und "Ein_Summe". Dann kommt es zum Fehler.
Distinct.jpg
Distinct.jpg (28.98 KiB) 1417 mal betrachtet
Gruß Barlee
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag von seve »

Es funktionniert aber, wenn ich DISTINCT lösche. Scheinbar liegt es am Vorname; Wenn ich "Vorname" aus den Sortier-Kriterien entferne, gehts auch...
Warum weiss ich nicht...

mfg
heinz_ketchup
****
Beiträge: 111
Registriert: So, 07.10.2007 16:05
Wohnort: München

Re: Zeilen / Zellen vereinen

Beitrag von heinz_ketchup »

Hi seve,

ja, kann man, zumindest in MySQL schreibst Du das # Zeichen am Zeilenanfang, und dann wird der nachfolgende Text ignoriert.

Schöne Grüße
Werner
------------------------------------------------------------
LibreOffice 3.5.4.2 auf Mac OS X 10.10.1 und MySQL 5.5
seve
**
Beiträge: 38
Registriert: So, 13.01.2008 17:54

Re: Zeilen / Zellen vereinen

Beitrag von seve »

Hi Barlee!

Ich hab was neues rausgefunden! Unter Extras -> Tabellenfilter kann man Tabellen, wie auch Ansichten verstecken. Man kann sie aber noch immer abfragen... Trägt zur Ästhetik bei der Arbeit mit Views bei 8)

Wenn ich also das mit den Parameter hinkriege ( viewtopic.php?f=8&t=15871 ), werd ichs mit den Views machen...

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

Zeilen / Zellen vereinen - definitive Codes

Beitrag von seve »

Hi Barlee

Ich bin mit meiner Arbeit also zu Ende. Habs also mit Views gemacht. Ich habe die Datenbank durchgetestet und dabei noch einige Fehler entdeckt...

- Bei der Nummerierung hatte ich den Vornamen nicht mitberücksichtigt; der muss auch mit konkadiert werden... (nicht so beim Vorkommen...)
- Ich hatte das mit dem CONCAT mal noch zu vereinfachen versucht, hatte also mit + gearbeitet. Das Verfahren versagt aber, sobald ein Datensatz in einem Argument keinen Wert liefert. Darum CONCAT...
- Das mit der Parameterabfrage bin ich umgangen. Habe einfach eine Tabelle erstellt, die Abfrage holt sich von dort den Parameter...

Nachfolgend noch meine definitiven Codes..

Code: Alles auswählen

--Zwischenschritt1
--( Quele definieren, als Ansicht gespeichert unter "VersandZwischenschritt1" )

SELECT "Nachname", "Vorname", "Strasse", "Nr", "PLZ", "Ort" FROM "Kontakte"
WHERE
	"Kategorie" = '1' AND
	"Gruppe" = ( SELECT "Gruppennummer_der_zum_Druck_aktivierten_Gruppe" FROM "Gruppe_zum_Druck_aktivieren" )
	AND "aktiv" = 'true'
ORDER BY "Nachname", "Strasse", "Nr", "PLZ", "Ort"

Code: Alles auswählen

-- VERSAND, Zwischenschritt 2
--    (sortiert, mit Vorkommen und Nummerierung, als Ansicht gespeichert unter "VersandZwischenschritt2" )

        SELECT
        "b"."Nachname", "b"."Vorname", "b"."Strasse", "b"."Nr", "b"."PLZ", "b"."Ort",

        (SELECT COUNT( CONCAT( "a"."Nachname", CONCAT("a"."Strasse", CONCAT("a"."Nr", CONCAT("a"."PLZ", "a"."Ort" )))) )
            FROM "VersandZwischenschritt1" AS "a"
            WHERE CONCAT( "a"."Nachname", CONCAT("a"."Strasse", CONCAT("a"."Nr", CONCAT("a"."PLZ", "a"."Ort" )))) =
            CONCAT( "b"."Nachname", CONCAT("b"."Strasse", CONCAT("b"."Nr", CONCAT("b"."PLZ", "b"."Ort" )))) )
        AS "Vorkommen",

        (SELECT COUNT( * ) FROM "VersandZwischenschritt1" AS "X"
                WHERE CONCAT( "X"."Nachname", CONCAT("X"."Strasse", CONCAT("X"."Nr", CONCAT("X"."PLZ", CONCAT("X"."Ort", "X"."Vorname" )))))  <
                CONCAT( "b"."Nachname", CONCAT("b"."Strasse", CONCAT("b"."Nr", CONCAT("b"."PLZ", CONCAT("b"."Ort", "b"."Vorname" )))))+1)
        AS "Nummerierung"

        FROM (
        SELECT  * FROM "VersandZwischenschritt1" AS "a"
        ) AS "b" ORDER BY "Nachname", "Strasse", "Nr", "PLZ", "Ort", "Vorname"

Code: Alles auswählen

-- VERSAND, Schluss-Abfrage
SELECT DISTINCT
"n"."Nachname",
CASE
    WHEN
        "Vorkommen" = '1'
    THEN    
        "n"."Vorname"
    WHEN
        "Vorkommen" = '2'
        AND "n"."Nummerierung" = "m"."Nummerierung"-1
        AND CONCAT( "n"."Nachname", CONCAT("n"."Strasse", CONCAT( "n"."Nr", CONCAT( "n"."PLZ", "n"."Ort" )))) =
                CONCAT( "m"."Nachname", CONCAT("m"."Strasse", CONCAT( "m"."Nr", CONCAT( "m"."PLZ", "m"."Ort" ))))
    THEN    
        CONCAT( "n"."Vorname",
            CONCAT( ' und ' ,
            SELECT "o"."Vorname" FROM "VersandZwischenschritt2" AS "o" WHERE "n"."Nummerierung" = "o"."Nummerierung"-1))
    WHEN
        "Vorkommen" = '3'
        AND "n"."Nummerierung" = "m"."Nummerierung"-1
        AND "n"."Nummerierung" = "p"."Nummerierung"-2
        AND CONCAT( "n"."Nachname", CONCAT("n"."Strasse", CONCAT( "n"."Nr", CONCAT( "n"."PLZ", "n"."Ort" ))))
            = CONCAT( "m"."Nachname", CONCAT("m"."Strasse", CONCAT( "m"."Nr", CONCAT( "m"."PLZ", "m"."Ort" ))))
        AND CONCAT( "m"."Nachname", CONCAT("m"."Strasse", CONCAT( "m"."Nr", CONCAT( "m"."PLZ", "m"."Ort" ))))
            = CONCAT( "p"."Nachname", CONCAT("p"."Strasse", CONCAT( "p"."Nr", CONCAT( "p"."PLZ", "p"."Ort" ))))
        AND CONCAT( "p"."Nachname", CONCAT("p"."Strasse", CONCAT( "p"."Nr", CONCAT( "p"."PLZ", "p"."Ort" ))))
            = CONCAT( "n"."Nachname", CONCAT("n"."Strasse", CONCAT( "n"."Nr", CONCAT( "n"."PLZ", "n"."Ort" ))))
    THEN    
        CONCAT( "n"."Vorname",
        CONCAT( ' und ' ,    
        CONCAT( SELECT "q"."Vorname" FROM "VersandZwischenschritt2" AS "q" WHERE "n"."Nummerierung" = "q"."Nummerierung"-1 ,
        CONCAT( ' und ' ,
        SELECT "w"."Vorname" FROM "VersandZwischenschritt2" AS "w" WHERE "n"."Nummerierung" = "w"."Nummerierung"-2
            ))))
    WHEN
        "Vorkommen" > '3'
    THEN    
        'Familie'
    ELSE
        'Das ist ein ungültiger Hund!'
END AS "Vorname"
,"n"."Strasse"
,"n"."Nr"
,"n"."PLZ"
,"n"."Ort"
FROM
"VersandZwischenschritt2" AS "n",
"VersandZwischenschritt2" AS "m",
"VersandZwischenschritt2" AS "p"
WHERE "Vorname" <> 'Das ist ein ungültiger Hund!'
So, das wars. Danke für die Mithilfe!

mfG Seve
Gesperrt