これはあなたが望んでいるよりクリーンなアプローチかもしれません。基本的に、変数がまだ初期化されているかどうかを確認します。そうでない場合は、空の文字列に設定し、最初の都市を追加します(先頭のコンマなし)。ある場合は、カンマを追加してから、都市を追加します。
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
もちろん、状態ごとに変数を設定する場合にのみ機能します。各状態のリストを一度に1つずつ引き出している場合、1つのショットでより良い解決策があります。
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 Databaseまたは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];