2013-03-22 12 views
7

Poniższy kod (który otrzymałem od here) wykonuje dobrą pracę przy łączeniu ze sobą wielu pól, oddzielając je przecinkami.Scalanie wielu wierszy w jedną kolumnę za pomocą wierszy z wierszami powrotu karetki

select player, 
    stuff((SELECT distinct ', ' + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH('')),1,1,'') 
from yourtable t1 
group by player 

Konieczne jest zastąpienie przecinków kanałami powrotu linii karetki. Wypróbowałem poniższy kod, ale rozpoczęto rozdzielanie wpisów tymi znakami: "# x0D;"

select player, 
    stuff((SELECT distinct CHAR(13)+CHAR(10) + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH('')),1,1,'') 
from yourtable t1 
group by player 

Podejrzewam, że problem jest z "FOR XML PATH ('')), 1,1 ''", ale nie wiem jakie wartości umieścić.

Każda pomoc zostanie bardzo doceniona.

Dzięki!

Odpowiedz

8

W rzeczywistości można zastąpić przecinek na wynik STUFF.

Spróbuj tego:

select player, 
    replace(stuff((SELECT distinct ', ' + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH('')),1,1,''), ',', char(13) + char(10)) 
from yourtable t1 
group by player 
+0

Udało się! Dzięki! :) – Osprey

+0

co powiesz na przejście do nowej linii zamiast przecinka? –

3

można obsługiwać wszystkie znaki specjalne, które dodaje XML (z których jeden jest #x0D;) za pomocą:

FOR XML PATH(''), TYPE).value('.','nvarchar(max)') 

Więcej informacji here.

Należy również dostosować trzeci parametr STUFF do liczby znaków, które trzeba przeskoczyć na początku swojego wyniku (w tym przypadku do 2 ponieważ masz char(13) i char(10)).

Więc rozwiązaniem byłoby:

select player, 
    stuff((SELECT distinct CHAR(13)+CHAR(10) + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH(''), TYPE).value('.','nvarchar(max)'),1,2,'') 
from yourtable t1 
group by player