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:
Als Ergebnis hätte ich gerne:
Was ich geschafft habe ist, x Varianten zu finden die mir die Zeilen pro Nr nicht zusammenfassen sondern folgendes Ergebnis liefern:
Wie muss hier der Ansatz aussehen? Danke für eure Hilfe.
Gruß Joni
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
Gruß Joni
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 177614
Url: https://administrator.de/contentid/177614
Ausgedruckt am: 25.11.2024 um 16:11 Uhr
3 Kommentare
Neuester Kommentar
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ß
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ß
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:Viele Grüße - Bernd
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