T-SQL concatenation in rows GROUP BY output

0

Cześć,

bardzo proszę o wskazówkę czego użyć aby z poniższej pierwszej tabeli (wynik group by) uzyskac efekt jak w drugiej tabeli- tzn. dla każdego Ticketa oddzielnie kombinacje PartNumber, która dla niego wystpąpily łącząć np. podkreślnikiem.

Domyślam się, że można za pomocą kursorów ale czuję, że jest prostszy i bardziej efektywny sposób.

Będę wdzięczny za każdą wskazówkę.
Pozdrawiam,
Arek

.........................................

ACTUAL TABLE
Ticket PartNumber
1 A
1 B
2 C
3 A
3 B
3 C
4 B
5 B
5 C
6 A
6 B
6 C
6 D

DESIRED TABLE
Ticket PartNumber_Combination
1 A B
2 C
3 A B C
4 B
5 B C
6 A B C D

1

Jest prostszy sposób, i nawet nie trzeba używać group by. Jeżeli danych będzie bardzo dużo, to warto rozważyć umieszczenie danych w tabeli tymczasowej. Można również użyć kodu, bez CTE lub tabel tymczasowych, ale z doświadczenia powiem, że w ten sposób zachowujesz większą elastyczność, a miarę rozrastania się kodu, łatwiej się nim zarządza.

WITH CTE_ActualTable
AS
( 
  SELECT distinct Ticket, 
    Stuff((
    SELECT ' ' + PartNumber  
      FROM   ActualTable at02
      WHERE  at01.Ticket  = at02.Ticket  
    FOR XML PATH('')), 1, 1, '') PartNumber_Combination
  FROM ActualTable at01
)

SELECT * FROM CTE_ActualTable
1

Jeżeli masz wersję 2017 to jest funkcja string_agg https://docs.microsoft.com/en[...]wFallbackFrom=sql-server-2014

0

Dziękuję chillycamel - działa pięknie - doszkolę się z tej struktury:)
Dziękuję Panczo - wyglądau wyjątkowo kusząco aczkolwiek nie mam 2017 niestety:)

Pozdrawiam,
Arek

0

Przy bardzo dużej ilości danych polecam funkcję agregująca napisaną w CLR którą wyczaił @Panczo - jest prze genialna jeśli chodzi o działanie i szybkość. Sam miód! Polecam

Tu link: https://github.com/orlando-co[...]ql-server-group-concat-sqlclr

0

No to poszukaj funkcji agregującej napisanej w CLR, pójdzie od >= 2005, przykład:
https://orlando-colamatteo.gi[...]cat-sqlclr/documentation.html

0

Z Pivotem:

WITH mydata(id, val) AS (
  SELECT * FROM (
    VALUES (1,'A'),(1,'B'),
           (2,'C'),
           (3,'A'),(3,'B'),(3,'C'),
           (4,'B'),
           (5,'B'),(5,'C'),
           (6,'A'),(6,'B'),(6,'C'),(6,'D')
  ) AS mydata(id, val)
)
SELECT * FROM mydata
PIVOT (
    max( val) FOR val IN ( A, B, C, D )
) AS p

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0