Datensätze in eine Zeile joinen

MSJones

Grünschnabel
Folgendes Szenario:
Ich hab drei Stellen, von denen ich Daten in eine Tabelle schreibe.
Werte mit derselben ID möcht ich dann mit Hilfe einer View in einer Zeile ausgeben. Aber irgendwie will mir das nicht so gelingen....

Also Ursprungstabelle:
ort | id | wert
-------------------
hier | 1 | 1
da | 1 | 1
dort | 1 | 1
hier | 2 | 2
da | 2 | 2
hier | 3 | 3
dort | 3 | 3
da | 4 | 4
dort | 4 | 4
hier | 5 | 5
da | 6 | 6
dort | 7 | 7


Als Ergebnis der View soll etwa sowas rauskommen:
id | hier | da | dort
------------------------
1 | 1 | 1 | 1
2 | 2 | 2 | null
3 | 3 | null | 3
4 | null | 4 | 4
5 | 5 | null | null
6 | null | 6 | null
7 | null | null | 7

Also quasi ne Mischung aus LEFT und RIGHT Join.

Aber irgendwie hab ich grad keine Idee, wie ich das hinkriegen soll.
Kann mir dabei jemand helfen?
 
Eine CrossView. In MS Access kannst du das als solche Erstellen. In Oracle oder MySQL musst du das von Hand stricken

Für MySQL kann das etwa so aussehen
SQL:
SELECT
	t.id,
	NULLIF(SUM(IF(t.ort = "hier", wert, 0)), 0)	AS hier,
	NULLIF(SUM(IF(t.ort = "da", wert, 0)), 0)	AS hier,
	NULLIF(SUM(IF(t.ort = "dort", wert, 0)), 0)	AS hier
FROM
	myTable AS t
GROUP BY
	t.id
 
Zuletzt bearbeitet von einem Moderator:
Erst mal danke für die Antwort.

Für mein MSSQL hab ich das dann wie folgt umgebastelt:
SQL:
SELECT
    t.id,
    NULLIF(SUM(CASE WHEN t.ort = 'hier' THEN value1 ELSE 0 END),0) AS hier,
    NULLIF(SUM(CASE WHEN t.ort = 'da' THEN value1 ELSE 0 END),0) AS da,
    NULLIF(SUM(CASE WHEN t.ort = 'dort' THEN value1 ELSE 0 END),0) AS dort
FROM
    test AS t
GROUP BY
    t.id

Funktioniert soweit auch wunderbar.

Hab die Testtabelle noch um eine VARCHAR-Spalte erweitert, sieht dann jetzt so aus:
ortidwertgeschrieben
hier11eins
da11eins
dort11eins
hier22zwei
da22zwei
hier33drei
dort33drei
da44vier
dort44vier
hier55fünf
da66sechs
dort77sieben

Und dann entsprechend das angepaßte SQL erweitert:
SQL:
SELECT
    t.id,
    NULLIF(SUM(CASE WHEN t.ort = 'hier' THEN wert ELSE 0 END),0) AS hier,
    NULLIF(SUM(CASE WHEN t.ort = 'da' THEN wert ELSE 0 END),0) AS da,
    NULLIF(SUM(CASE WHEN t.ort = 'dort' THEN wert ELSE 0 END),0) AS dort,
    MIN(CASE WHEN t.ort = 'hier' THEN geschrieben ELSE NULL END) AS hier_geschrieben,
    MIN(CASE WHEN t.ort = 'da' THEN geschrieben ELSE NULL END) AS da_geschrieben,
    MIN(CASE WHEN t.ort = 'dort' THEN geschrieben ELSE NULL END) AS dort_geschrieben
FROM
    test AS t
GROUP BY
    t.id

Das Ergebnis scheint richtig zu sein.
Zumindest für die Testtabelle bekomme ich die Werte, die ich haben möchte.
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück