IF OBJECT_ID('master..test') is not null Drop table test
CREATE TABLE test (ID INTEGER, NAME VARCHAR (50), VALUE INTEGER);
INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);
select distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc
Nazywam tabela testy, a dla concatination używam Dla XML Path ('') składnia. Funkcja stuff wstawia ciąg do innego ciągu. Usuwa określoną długość znaków w pierwszym ciągu w pozycji początkowej, a następnie wstawia drugi ciąg do pierwszego ciągu w pozycji początkowej.
funkcje rzeczy wygląda następująco: STUFF (character_expression, start, długość, character_expression)
character_expression jest wyrazem danych znakowych. character_expression może być stałą, zmienną lub kolumną o wartości lub danych binarnych.
Uruchom Jest to wartość całkowita, która określa lokalizację, od której należy rozpocząć usuwanie i wstawianie. Jeśli start lub length jest ujemny, zwracany jest pusty łańcuch znaków. Jeśli start jest dłuższy niż pierwszy character_expression, zwracany jest łańcuch pusty. start może być typu bigint.
długość Jest liczbą całkowitą określającą liczbę znaków do usunięcia. Jeśli długość jest dłuższa niż pierwsze wyrażenie_znakowe, usunięcie do ostatniego znaku z ostatniego wyrażenia_znakowego następuje po . długość może być typu bigint.
To nie daje tego, o co prosi Biswa. – eisberg
dziękuję, sami, o to proszę o @biswa – Biswa
Uważam, że ważne jest ostrzeganie ludzi, że używanie tylko jednego rodzaju separatora może być niekorzystne. Proponuję uczynić separator "name" jako średnik (;), a separator wartości może pozostać jako przecinek (,) –