Bu peşinde olduğunuz daha temiz bir yaklaşım olabilir. Temel olarak, değişkenin henüz başlatılıp başlatılmadığını kontrol edin. Değilse, boş dizgeye ayarlayın ve ilk şehri ekleyin (virgül yok). Varsa, virgül ekleyin, sonra şehri ekleyin.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Tabii ki, bu sadece durum başına bir değişkeni doldurmak için işe yarar. Listeyi her bir durum için birer birer çekiyorsanız, bir kerede daha iyi bir çözüm var:
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];
Sonuçlar:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
Her eyalette şehir adına göre sipariş etmek için:
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 Veritabanı veya SQL Server 2017+ 'de, yeni STRING_AGG()
işlevi kullanabilirsiniz :
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Ve şehir adına göre sıralı:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];