T-SQL concatenation in rows GROUP BY output

T-SQL concatenation in rows GROUP BY output
AR
  • Rejestracja:około 9 lat
  • Ostatnio:około 4 lata
  • Postów:92
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

edytowany 1x, ostatnio: arhetyp
CH
CH
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:19
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.

Kopiuj
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
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 7 godzin
  • Postów:3876
1
AR
  • Rejestracja:około 9 lat
  • Ostatnio:około 4 lata
  • Postów:92
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

BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 dni
  • Postów:454
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-colamatteo/ms-sql-server-group-concat-sqlclr

PA
Na telefonie jestem za wolny ;)
BlackBad
;) nie mogłem o niej nie wspomnieć - funkcja jest prze kozacka. Po prawdzie powinienem wrócić do tego swojego tematu i zmienić oznaczenie odpowiedzi na ten Twój ostatni post gdzie ja podajesz ;)
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 7 godzin
  • Postów:3876
0

No to poszukaj funkcji agregującej napisanej w CLR, pójdzie od >= 2005, przykład:
https://orlando-colamatteo.github.io/ms-sql-server-group-concat-sqlclr/documentation.html

SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0

Z Pivotem:

Kopiuj
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
PA
Tylko to zwróci kilka kolumn zamiaat jednej
SP
@Panczo: ja myślałem, że tak ma być ¯\(ツ)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.