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-Key: 243002

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: StefanLausL
StefanLausL Jul 08, 2014 at 08:07:37 (UTC)
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
Member: StefanLausL
StefanLausL Jul 08, 2014 at 08:15:45 (UTC)
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);
Member: LianenSchwinger
LianenSchwinger Jul 08, 2014 updated at 10:37:53 (UTC)
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
Member: archivario
archivario Jul 10, 2014 at 07:47:12 (UTC)
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?
Member: Biber
Biber Jul 10, 2014 at 09:36:08 (UTC)
Goto Top
Moin archivario,

TOM TOM gibt es.
FROM FROM nicht.

Grüße
Biber
Member: LianenSchwinger
LianenSchwinger Jul 10, 2014 at 10:22:51 (UTC)
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
Member: archivario
archivario Jul 10, 2014 at 10:35:21 (UTC)
Goto Top
hi bieber,

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


gruß
archivario
Member: archivario
archivario Jul 10, 2014 at 10:41:32 (UTC)
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
Member: LianenSchwinger
LianenSchwinger Jul 10, 2014 at 10:44:36 (UTC)
Goto Top
... ja das Komma hinter Perioden muss noch weg. Hatte ich auch übersehen.

G LianenSchwinger
Member: archivario
archivario Jul 10, 2014 at 11:13:12 (UTC)
Goto Top
leider immer noch die gleiche Fehlermeldung face-sad
Member: LianenSchwinger
LianenSchwinger Jul 10, 2014 updated at 11:22:57 (UTC)
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
Member: StefanLausL
StefanLausL Jul 10, 2014 at 11:45:30 (UTC)
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 ?
Member: archivario
archivario Jul 10, 2014 at 11:50:48 (UTC)
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
Member: archivario
archivario Jul 10, 2014 at 11:55:55 (UTC)
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