SOLUSI
Definisi optimal dapat bervariasi, tetapi inilah cara menggabungkan string dari baris yang berbeda menggunakan Transact SQL biasa, yang seharusnya berfungsi dengan baik di Azure.
;WITH Partitioned AS
(
SELECT
ID,
Name,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
COUNT(*) OVER (PARTITION BY ID) AS NameCount
FROM dbo.SourceTable
),
Concatenated AS
(
SELECT
ID,
CAST(Name AS nvarchar) AS FullName,
Name,
NameNumber,
NameCount
FROM Partitioned
WHERE NameNumber = 1
UNION ALL
SELECT
P.ID,
CAST(C.FullName + ', ' + P.Name AS nvarchar),
P.Name,
P.NameNumber,
P.NameCount
FROM Partitioned AS P
INNER JOIN Concatenated AS C
ON P.ID = C.ID
AND P.NameNumber = C.NameNumber + 1
)
SELECT
ID,
FullName
FROM Concatenated
WHERE NameNumber = NameCount
Penjelasan
Pendekatan ini bermuara pada tiga langkah:
-
Beri nomor pada baris menggunakan
OVER
danPARTITION
mengelompokkan dan mengurutkannya sesuai kebutuhan untuk rangkaian. Hasilnya adalahPartitioned
CTE. Kami menghitung jumlah baris di setiap partisi untuk menyaring hasilnya nanti. -
Menggunakan CTE rekursif (
Concatenated
) ulangi melalui nomor baris (NameNumber
kolom) menambahkanName
nilai keFullName
kolom. -
Saring semua hasil kecuali yang dengan
NameNumber
tertinggi .
Harap diingat bahwa untuk membuat kueri ini dapat diprediksi, seseorang harus mendefinisikan kedua pengelompokan (misalnya, dalam baris skenario Anda dengan ID
yang sama digabungkan) dan menyortir (saya berasumsi bahwa Anda cukup mengurutkan string menurut abjad sebelum penggabungan).
Saya telah dengan cepat menguji solusi pada SQL Server 2012 dengan data berikut:
INSERT dbo.SourceTable (ID, Name)
VALUES
(1, 'Matt'),
(1, 'Rocks'),
(2, 'Stylus'),
(3, 'Foo'),
(3, 'Bar'),
(3, 'Baz')
Hasil kueri:
ID FullName
----------- ------------------------------
2 Stylus
3 Bar, Baz, Foo
1 Matt, Rocks