Seite 2 von 2

Re: Zeilen / Zellen vereinen

Verfasst: Mo, 21.01.2008 14:05
von seve
Yuuhuuu! Ich bin einen Schritt weitergekommen...

Man habe folgende Tabelle:
1.png
1.png (5.44 KiB) 1680 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) 1681 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) 1680 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?

Verfasst: Mo, 21.01.2008 21:23
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) 1660 mal betrachtet
...und nach dem äußeren SELECT
Adressen.jpg
Adressen.jpg (10.66 KiB) 1659 mal betrachtet
Gruß Barlee

Re: Zeilen / Zellen vereinen

Verfasst: Mi, 23.01.2008 16:59
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

Re: Zeilen / Zellen vereinen

Verfasst: Mi, 23.01.2008 20:19
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

Re: Zeilen / Zellen vereinen

Verfasst: Fr, 25.01.2008 10:59
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

Re: Zeilen / Zellen vereinen

Verfasst: Fr, 25.01.2008 13:21
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

Re: Zeilen / Zellen vereinen

Verfasst: Fr, 25.01.2008 23:31
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) 1552 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

Re: Zeilen / Zellen vereinen

Verfasst: Sa, 26.01.2008 12:30
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

Re: Zeilen / Zellen vereinen

Verfasst: Sa, 26.01.2008 17:20
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

Re: Zeilen / Zellen vereinen

Verfasst: Mo, 28.01.2008 12:52
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?

Re: Zeilen / Zellen vereinen

Verfasst: Mo, 28.01.2008 22:15
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) 1484 mal betrachtet
Gruß Barlee

Re: Zeilen / Zellen vereinen

Verfasst: Di, 29.01.2008 13:56
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

Re: Zeilen / Zellen vereinen

Verfasst: Mi, 30.01.2008 09:47
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

Re: Zeilen / Zellen vereinen

Verfasst: Mi, 30.01.2008 12:20
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

Zeilen / Zellen vereinen - definitive Codes

Verfasst: Mo, 04.02.2008 20:44
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