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
OVERdanPARTITIONmengelompokkan dan mengurutkannya sesuai kebutuhan untuk rangkaian. Hasilnya adalahPartitionedCTE. Kami menghitung jumlah baris di setiap partisi untuk menyaring hasilnya nanti. -
Menggunakan CTE rekursif (
Concatenated) ulangi melalui nomor baris (NameNumberkolom) menambahkanNamenilai keFullNamekolom. -
Saring semua hasil kecuali yang dengan
NameNumbertertinggi .
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