Estou tentando alcançar o seguinte:
California | Los Angeles, San Francisco, Sacramento
Florida | Jacksonville, Miami
Infelizmente, estou recebendo ", Los Angeles, San Francisco, Sacramento, Jacksonville, Miami"
Eu posso alcançar meus resultados desejados usando a função STUFF, mas queria saber se existe uma maneira mais limpa de fazer isso usando COALESCE?
STATE | CITY
California | San Francisco
California | Los Angeles
California | Sacramento
Florida | Miami
Florida | Jacksonville
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + city
FROM tbl where city = 'California';
SELECT @col;
Obrigado
Esta pode ser a abordagem mais limpa que você procura. Basicamente, verifique se a variável já foi inicializada. Se não tiver, defina-o para a string vazia e anexe a primeira cidade (sem vírgula à esquerda). Se tiver, acrescente uma vírgula e acrescente a cidade.
Claro, isso só funciona para preencher uma variável por estado. Se você estiver puxando a lista para cada estado, um de cada vez, há uma solução melhor de uma só vez:
Resultados:
Para ordenar pelo nome da cidade dentro de cada estado:
No Banco de Dados SQL do Azure ou SQL Server 2017+, você pode usar a nova
STRING_AGG()
função :E ordenados pelo nome da cidade:
Apenas para adicionar à resposta de Aaron acima ...
Esteja ciente de que um
ORDER BY
pode quebrar ao incluir apenas o último item em sua consulta. No meu caso, eu não estava agrupando, então não tenho certeza se isso faz diferença. Estou usando o SQL 2014. No meu caso, tenho algo como valor1, valor2, valor3... mas meu resultado na variável foi apenas valor3.Aaron comentou para dizer:
Isso foi relatado pelo menos quatro vezes no Connect:
Exemplo de resposta da Microsoft:
A resposta também faz referência ao KB 287515:
PRB: Plano de execução e resultados de consultas de concatenação agregada dependem da localização da expressão
A solução é usar
FOR XML PATH
(a segunda abordagem na resposta de Aaron) se a ordem de concatenação for importante e, é claro, se você quiser incluir todos os valores. Veja também:Concatenação de nvarchar / índice / comportamento inexplicável de nvarchar (max) no Stack Overflow