Đây có thể là cách tiếp cận sạch hơn bạn sau. Về cơ bản, kiểm tra xem biến đã được khởi tạo chưa. Nếu không, đặt chuỗi đó vào chuỗi trống và nối thêm thành phố đầu tiên (không có dấu phẩy hàng đầu). Nếu có, hãy thêm dấu phẩy, sau đó nối thành phố.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Tất nhiên, điều đó chỉ hoạt động để điền một biến cho mỗi trạng thái. Nếu bạn đang kéo danh sách cho từng trạng thái một lần, có một giải pháp tốt hơn trong một lần chụp:
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];
Các kết quả:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
Để đặt hàng theo tên thành phố trong mỗi tiểu bang:
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];
Trong Azure SQL Database hoặc SQL Server 2017+, bạn có thể sử dụng chức năng mớiSTRING_AGG()
:
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Và đặt hàng theo tên thành phố:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];