SQL 2008R2: Bestimmte Spalte mehrerer Zeilen verketten
Hallo zusammen,
nachdem ich jetzt schon Stunden verbracht habe um eine Lösung zu finden, hoffe ich auf ein erhellendes Licht in diesem Forum. Folgendes Problem habe ich:
Per SQL-View stelle ich mir aus einer Tabelle verschiedene Spalten zusammen. Bei einer Abfrage tauchen zu einer Belegnummer mehrere Treffer auf, diese beinhalten mehrere Personalnummern:
Ergebnis:
Belegnummer Personalnummer Name
12 22 Test
12 25 Test2
Als Ergebnis brauche ich jedoch folgendes:
Belegnummer Personalnummer Name
12 22 25 Test Test2
Wie gehe ich in meinem select am besten vor um hier zu verketten?
Vielen Dank
nachdem ich jetzt schon Stunden verbracht habe um eine Lösung zu finden, hoffe ich auf ein erhellendes Licht in diesem Forum. Folgendes Problem habe ich:
Per SQL-View stelle ich mir aus einer Tabelle verschiedene Spalten zusammen. Bei einer Abfrage tauchen zu einer Belegnummer mehrere Treffer auf, diese beinhalten mehrere Personalnummern:
Ergebnis:
Belegnummer Personalnummer Name
12 22 Test
12 25 Test2
Als Ergebnis brauche ich jedoch folgendes:
Belegnummer Personalnummer Name
12 22 25 Test Test2
Wie gehe ich in meinem select am besten vor um hier zu verketten?
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 243002
Url: https://administrator.de/forum/sql-2008r2-bestimmte-spalte-mehrerer-zeilen-verketten-243002.html
Ausgedruckt am: 09.04.2025 um 03:04 Uhr
14 Kommentare
Neuester Kommentar
So hab ein Beispiel von mir gefunden:
Hier wird die Menge aller eingegangenen Belege gezählt und nach Kalenderwoche in Spalten aufgelistet:
INSERT INTO #t (
Datenbank
,Kalenderwoche
)
SELECT
Datenbank
,DATEPART(ww,b.EingegangenAm)
FROM dbo.tBeleg b (NOLOCK)
PRINT ''? rowcount: '' + LTRIM(@@ROWCOUNT)
END;'
DECLARE @command NVARCHAR(MAX)
;WITH dates AS (
SELECT DISTINCT
CONVERT(NVARCHAR(10), t.Kalenderwoche, 120) CommandDate
FROM #t t
)
SELECT @command = STUFF((
SELECT DISTINCT ', ' + '[' + d.CommandDate + ']'
FROM dates d
FOR XML PATH('')), 1, 1, ''
);
SELECT @command = '
SELECT *
FROM (
SELECT t.Datenbank
,CONVERT(NVARCHAR(10), t.Kalenderwoche, 120) CommandDate
,1 Value
FROM #t t
) t
PIVOT
(
COUNT(Value)
FOR CommandDate IN (' + @command + ')
) AS pvt
';
PRINT @command
EXEC(@command);
Hier wird die Menge aller eingegangenen Belege gezählt und nach Kalenderwoche in Spalten aufgelistet:
INSERT INTO #t (
Datenbank
,Kalenderwoche
)
SELECT
Datenbank
,DATEPART(ww,b.EingegangenAm)
FROM dbo.tBeleg b (NOLOCK)
PRINT ''? rowcount: '' + LTRIM(@@ROWCOUNT)
END;'
DECLARE @command NVARCHAR(MAX)
;WITH dates AS (
SELECT DISTINCT
CONVERT(NVARCHAR(10), t.Kalenderwoche, 120) CommandDate
FROM #t t
)
SELECT @command = STUFF((
SELECT DISTINCT ', ' + '[' + d.CommandDate + ']'
FROM dates d
FOR XML PATH('')), 1, 1, ''
);
SELECT @command = '
SELECT *
FROM (
SELECT t.Datenbank
,CONVERT(NVARCHAR(10), t.Kalenderwoche, 120) CommandDate
,1 Value
FROM #t t
) t
PIVOT
(
COUNT(Value)
FOR CommandDate IN (' + @command + ')
) AS pvt
';
PRINT @command
EXEC(@command);
Hallo archivario,
versuch es mal mit folgendem Code, wobei TableName Dein View ist.
G Jörg
versuch es mal mit folgendem Code, wobei TableName Dein View ist.
SELECT Belegnummer,
STUFF((SELECT DISTINCT ' '+ Personalnummer
FROM TableName a
WHERE b.Belegnummer = a.Belegnummer FOR XML PATH('')),1 ,1, '') Personalnummern,
STUFF((SELECT DISTINCT ' '+ Name
FROM TableName a
WHERE b.Belegnummer = a.Belegnummer FOR XML PATH('')),1 ,1, '') Namen,
FROM TableName b
GROUP BY Belegnummer;
G Jörg
Hallo Biber,
wollte ich auch grad drauf hinweisen.
Müsste laufen.
G LianenSchwinger
wollte ich auch grad drauf hinweisen.
SELECT belegnr,
STUFF((SELECT DISTINCT ' ' + a.persnr
FROM [test].[dbo].[Material_Stundennachweis] a
WHERE b.belegnr = a.belegnr FOR XML PATH('')), 1 , 1, '') Personalnummern,
STUFF((SELECT DISTINCT ' ' + a.periode
FROM [test].[dbo].[Material_Stundennachweis] a
WHERE b.belegnr = a.belegnr FOR XML PATH('')), 1 , 1, '') Perioden,
FROM [test].[dbo].[Material_Stundennachweis] b
GROUP BY belegnr;
Müsste laufen.
G LianenSchwinger
mmh, dann weiß ich im Moment auch nichts mehr ... folgendes funktioniert also nicht?
SELECT b.belegnr,
STUFF((SELECT DISTINCT ' ' + a.persnr
FROM [test].[dbo].[Material_Stundennachweis] a
WHERE b.belegnr = a.belegnr FOR XML PATH('')), 1 , 1, '') Personalnummern,
STUFF((SELECT DISTINCT ' ' + a.periode
FROM [test].[dbo].[Material_Stundennachweis] a
WHERE b.belegnr = a.belegnr FOR XML PATH('')), 1 , 1, '') Perioden
FROM [test].[dbo].[Material_Stundennachweis] b
GROUP BY belegnr;
Ich komme aus der Oracle-Welt daher ist mein MS-SQL nicht so dolle.
Habe auch gerade keine Möglichkeit auf unserem SQL-Server 2012 das zu testen.
Die Schreibweise [test].[dbo].[Material_Stundennachweis] ist aber korrekt? Oder will MS-SQL ein AS vor Personalnummer und Perioden?
G LianenSchwinger
SELECT b.belegnr,
STUFF((SELECT DISTINCT ' ' + a.persnr
FROM [test].[dbo].[Material_Stundennachweis] a
WHERE b.belegnr = a.belegnr FOR XML PATH('')), 1 , 1, '') Personalnummern,
STUFF((SELECT DISTINCT ' ' + a.periode
FROM [test].[dbo].[Material_Stundennachweis] a
WHERE b.belegnr = a.belegnr FOR XML PATH('')), 1 , 1, '') Perioden
FROM [test].[dbo].[Material_Stundennachweis] b
GROUP BY belegnr;
Ich komme aus der Oracle-Welt daher ist mein MS-SQL nicht so dolle.
Habe auch gerade keine Möglichkeit auf unserem SQL-Server 2012 das zu testen.
Die Schreibweise [test].[dbo].[Material_Stundennachweis] ist aber korrekt? Oder will MS-SQL ein AS vor Personalnummer und Perioden?
G LianenSchwinger