archivario
Goto Top

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

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

StefanLausL
StefanLausL 08.07.2014 um 10:07:37 Uhr
Goto Top
Hallo,

leider finde ich gerade kein Beispiel von mir:

Google einfach mal nach: pivot for xml sql

Da ist einiges dabei.


Gruß Stefan
StefanLausL
StefanLausL 08.07.2014 um 10:15:45 Uhr
Goto Top
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);
LianenSchwinger
LianenSchwinger 08.07.2014 aktualisiert um 12:37:53 Uhr
Goto Top
Hallo archivario,

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
archivario
archivario 10.07.2014 um 09:47:12 Uhr
Goto Top
Hi LianenSchwinger,

habe Deinen Vorschlag mal getestet aber leider ohne Erfolg, hier der original Aufruf:

SELECT belegnr,
STUFF((SELECT DISTINCT ' '+ persnr
FROM [test].[dbo].[Material_Stundennachweis] a
WHERE b.belegnr = a.belegnr FOR XML PATH('')),1 ,1, '') Personalnummern,
STUFF((SELECT DISTINCT ' '+ periode
FROM 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;


Ergebnis:

Meldung 156, Ebene 15, Status 1, Zeile 9
Falsche Syntax in der Nähe des FROM-Schlüsselworts.

Was mache ich falsch?
Biber
Biber 10.07.2014 um 11:36:08 Uhr
Goto Top
Moin archivario,

TOM TOM gibt es.
FROM FROM nicht.

Grüße
Biber
LianenSchwinger
LianenSchwinger 10.07.2014 um 12:22:51 Uhr
Goto Top
Hallo Biber,

wollte ich auch grad drauf hinweisen. face-smile

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. face-smile

G LianenSchwinger
archivario
archivario 10.07.2014 um 12:35:21 Uhr
Goto Top
hi bieber,

danke für den Hinweis, ist beim kopieren passiert. Leider ist der Fehler noch der selbe....


gruß
archivario
archivario
archivario 10.07.2014 um 12:41:32 Uhr
Goto Top
Hi LianenSchwinger,

unabhängig von dem doppelten FROM bekomme ich die identische Fehlermeldung, stört sich an der Zeile 8.

Hast Du noch eine Idee?

Gruß und danke
LianenSchwinger
LianenSchwinger 10.07.2014 um 12:44:36 Uhr
Goto Top
... ja das Komma hinter Perioden muss noch weg. Hatte ich auch übersehen.

G LianenSchwinger
archivario
archivario 10.07.2014 um 13:13:12 Uhr
Goto Top
leider immer noch die gleiche Fehlermeldung face-sad
LianenSchwinger
LianenSchwinger 10.07.2014 aktualisiert um 13:22:57 Uhr
Goto Top
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. face-smile
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
StefanLausL
StefanLausL 10.07.2014 um 13:45:30 Uhr
Goto Top
Hast du meinen Vorschlag auch mal probiert ?
Der funktioniert 100% ig.
Musst hat nur auf Deine Bedürfnisse anpassen.

Oder hab ich was an Deiner Frage Missverstanden ?
archivario
archivario 10.07.2014 um 13:50:48 Uhr
Goto Top
das war es, AS fehlte, jetzt kommt auch ein Ergebnis, zwar ein überraschendes aber es kommt.

Er schneidet alles auf 5 Zeichen zusammen..

Vielleicht kannst Du mir den Aufruf mit wenigen Sätzen erklären?

Gruß

archivario
archivario
archivario 10.07.2014 um 13:55:55 Uhr
Goto Top
Hi StefanLausL,

ehrlich gesagt war ich damit überfordert, habe versucht den Ablauf zu verstehen aber das fällt mir ziemlich schwer.
Ich kratze immer nur an der Oberfläche von SQL und das hat bisher gereicht...

Gruß

archivario