Це може бути більш чистим підходом, який ви дотримуєтесь. По суті, перевірте, чи змінена ініціалізована ще. Якщо цього немає, встановіть його в порожній рядок і додайте перше місто (немає першої коми). Якщо є, то додайте кому, а потім додайте місто.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Звичайно, це працює лише для заповнення змінної на стан. Якщо ви тягнете список для кожної держави по черзі, є краще рішення за один кадр:
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];
Результати:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
Щоб замовити назву міста в кожному штаті:
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];
У базах даних Azure SQL або SQL Server 2017+ ви можете використовувати нову STRING_AGG()
функцію :
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
І впорядковано за назвою міста:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];