Questo potrebbe essere l'approccio più pulito che stai cercando. Fondamentalmente, controlla se la variabile è stata ancora inizializzata. In caso contrario, impostalo sulla stringa vuota e aggiungi la prima città (senza virgola iniziale). In tal caso, aggiungi una virgola, quindi aggiungi la città.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Naturalmente, questo funziona solo per il popolamento di una variabile per stato. Se stai tirando la lista per ogni stato uno alla volta, c'è una soluzione migliore in un colpo solo:
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];
risultati:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
Per ordinare in base al nome della città all'interno di ogni stato:
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];
Nel database SQL di Azure o in SQL Server 2017+, è possibile usare la nuova STRING_AGG()
funzione :
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
E ordinato per nome della città:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];