joni2000de
Goto Top

MSSQL Daten aus Zeilen in Spalten ausgeben

Hi Admins,

ich hoffe ihr könnt mir bei meinem SQL-Problem auf die Sprünge helfen. Folgende Vorgaben:

Tabelle 1
NR___Bezeichnung
1___Haus1
2___Haus2
3___Haus3
4___Haus4
5___Haus5

Tabelle 2
NR___Funktion___Name
1___2___Müller
1___4___Maier
3___4___Huber
5___2___Metzler
5___4___Gruber

Als Ergebnis hätte ich gerne:

NR___Bezeichnung___Funktion2___Funktion4
1___Haus1___Müller___Maier
2___Haus2___NULL___NULL
3___Haus3___NULL___Huber
4___Haus4___NULL___NULL
5___Haus5___Metzler___Gruber

Was ich geschafft habe ist, x Varianten zu finden die mir die Zeilen pro Nr nicht zusammenfassen sondern folgendes Ergebnis liefern:
NR___Bezeichnung___Funktion2___Funktion4
1___Haus1___Müller___NULL
1___Haus1___NULL___Maier
2___Haus2___NULL___NULL
3___Haus3___NULL___NULL
3___Haus3___NULL___Huber
4___Haus4___NULL___NULL
5___Haus5___Metzler___NULL
5___Haus5___NULL___Gruber
Wie muss hier der Ansatz aussehen? Danke für eure Hilfe.

Gruß Joni

Content-ID: 177614

Url: https://administrator.de/contentid/177614

Ausgedruckt am: 25.11.2024 um 16:11 Uhr

Indrador
Indrador 13.12.2011 um 10:54:03 Uhr
Goto Top
Hi,

1. für die Anforderung ist dein Datenmodell mehr als nur suboptimal und generell wirkt es nicht gut überdacht, wirf mal einen Blick auf Artikel über Normalisierung in Datenbanken.
2. Falls die Attributsbezeichnungen tatsächlich so sind, sind sie eine Katastophe, es gibt sehr gute Bücher über Namenskonventionen in Datenbanken.

Folgendes Select deckt deine Anforderung ab, solange es nur eine Funktion nur ein einziges mal je Haus gibt,
wenn es in Haus 2 die Funktion 2 mehrmals geben kann, gibt die Query einen Fehler zurück und das unsinnige Datenmodell wird noch unsinniger.

Select h.Nr,
h.Bezeichnung,
isnull((Select f1.Funktion from Tabelle2 f1 where f1.NR = h.NR and f1.Funktion = 1), 'Keine Funktion') as 'Funktion 1',
isnull((Select f2.Funktion from Tabelle2 f2 where f2.NR = h.NR and f2.Funktion = 2), 'Keine Funktion') as 'Funktion 2',
isnull((Select f3.Funktion from Tabelle2 f3 where f3.NR = h.NR and f3.Funktion = 3), 'Keine Funktion') as 'Funktion 3',
isnull((Select f4.Funktion from Tabelle2 f4 where f4.NR = h.NR and f4.Funktion = 4), 'Keine Funktion') as 'Funktion 4',
isnull((Select f5.Funktion from Tabelle2 f5 where f5.NR = h.NR and f5.Funktion = 5), 'Keine Funktion') as 'Funktion 5'
from Tabelle1 h

Gruß
joni2000de
joni2000de 13.12.2011 um 13:52:10 Uhr
Goto Top
Hi,

danke für deine Hilfe! Sie hat den nötigen Anstoß gegeben. Ich habe das ganze über left join gelöst.

zu 1. Das Datenmodell kann ich nicht beinflussen.
zu 2. Das war nur die vereinfachte Darstellung die Namen sind schon schön face-smile

Gruß Joni
Berrnd
Berrnd 13.12.2011 um 22:44:47 Uhr
Goto Top
Hi,

der Beitrag ist zwar schon als gelöst markiert, aber ich hatte grad Zeit und Lust damit zu "spielen": ;)
Ist ja fast ein schönes Beispiel, das mittels Pivotisierung gelöst werden kann, hier mal ein Code-Beispiel mit deinen Daten:
select	nr as NR,
		bezeichnung as Bezeichnung,
		[1] as Funktion1,
		[2] as Funktion2,
		[3] as Funktion3,
		[4] as Funktion4,
		[5] as Funktion5,
		[6] as Funktion6,
		[7] as Funktion7,
		[8] as Funktion8,
		[9] as Funktion9,
		[10] as Funktion10,
		[11] as Funktion11,
		[12] as Funktion12
from (
select tab1.nr, tab1.bezeichnung, tab2.funktion, tab2.name
from dbo.test2 tab1
left join dbo.test3 tab2
	on tab1.nr = tab2.nr) s1
pivot (max(name) for funktion
in (	[1], [2], [3], [4],
		[5], [6], [7], [8],
		[9], [10], [11], [12])) as pvt
order by nr
Viele Grüße - Bernd