Ini mungkin pendekatan bersih yang Anda cari. Pada dasarnya, periksa apakah variabel sudah diinisialisasi. Jika belum, setel ke string kosong, dan tambahkan kota pertama (tanpa koma terkemuka). Jika sudah, maka tambahkan koma, lalu tambahkan kota.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Tentu saja, itu hanya berfungsi untuk mengisi variabel per negara. Jika Anda menarik daftar untuk setiap negara bagian satu per satu, ada solusi yang lebih baik dalam satu kesempatan:
SELECT [state], cities = STUFF((
SELECT N', ' + city FROM dbo.tbl
WHERE [state] = x.[state]
FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];
Hasil:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
Untuk memesan berdasarkan nama kota di setiap negara bagian:
SELECT [state], cities = STUFF((
SELECT N', ' + city FROM dbo.tbl
WHERE [state] = x.[state]
ORDER BY city
FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];
Di Azure SQL Database atau SQL Server 2017+, Anda dapat menggunakan fungsi baruSTRING_AGG()
:
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Dan dipesan dengan nama kota:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];