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];
Hanya untuk menambah jawaban Harun di atas ...
Sadarilah bahwa sebuah
ORDER BY
break hanya dapat menyertakan item terakhir dalam kueri Anda. Dalam kasus saya, saya tidak mengelompokkan, jadi tidak yakin apakah itu membuat perbedaan. Saya menggunakan SQL 2014. Dalam kasus saya, saya memiliki sesuatu seperti value1, value2, value3 ... tetapi hasil saya dalam variabel hanya value3.Aaron berkomentar untuk mengatakan:
Ini telah dilaporkan setidaknya empat kali di Connect:
Contoh respons dari Microsoft:
Respons itu juga merujuk KB 287515:
PRB: Rencana Eksekusi dan Hasil Permintaan Gabungan Agregat Tergantung Lokasi Ekspresi
Solusinya adalah menggunakan
FOR XML PATH
(pendekatan kedua dalam jawaban Harun) jika urutan rangkaian itu penting dan, tentu saja, jika Anda ingin memastikan untuk memasukkan semua nilai. Lihat juga:nvarchar concatenation / index / nvarchar (max) perilaku yang tidak bisa dijelaskan pada Stack Overflow
sumber