Eu tenho alguns customer_comments
divididos em várias linhas devido ao design do banco de dados e, para um relatório, preciso combinar o comments
de cada exclusivo id
em uma linha. Eu já havia tentado algo trabalhando com essa lista delimitada da cláusula SELECT e do truque COALESCE, mas não consigo me lembrar e não deve ter salvado. Também não consigo fazê-lo funcionar neste caso, apenas parece funcionar em uma única linha.
Os dados são assim:
id row_num customer_code comments
-----------------------------------
1 1 Dilbert Hard
1 2 Dilbert Worker
2 1 Wally Lazy
Meus resultados precisam ficar assim:
id customer_code comments
------------------------------
1 Dilbert Hard Worker
2 Wally Lazy
Então, para cada row_num
não há realmente apenas uma linha de resultados; os comentários devem ser combinados na ordem de row_num
. O link acimaSELECT
truque funciona para obter todos os valores de uma consulta específica como uma linha, mas não consigo descobrir como fazê-lo funcionar como parte de uma SELECT
instrução que cospe todas essas linhas.
Minha consulta precisa percorrer toda a tabela por conta própria e gerar essas linhas. Não os estou combinando em várias colunas, uma para cada linha, portanto PIVOT
não parece aplicável.
fonte
order by
na subconsulta. Isso está criando XML usandofor xml
e essa é a maneira de criar XML usando TSQL. A ordem dos elementos nos arquivos XML é um assunto importante e pode ser confiável. Portanto, se essa técnica não garantir a ordem, o suporte a XML no TSQL será gravemente quebrado.row_num desc
deve obedecer aoorder by
que Mikael sugeriu). Vou remover os comentários que sugerem o contrário agora que a consulta contém o direitoorder by
e espero que @JonSeigel considere fazer o mesmo.Se você tem permissão para usar o CLR em seu ambiente, este é um caso personalizado para um agregado definido pelo usuário.
Em particular, esse é provavelmente o caminho a seguir se os dados de origem não forem trivialmente grandes e / ou você precisar fazer muito esse tipo de coisa em seu aplicativo. Suspeito fortemente que o plano de consulta da solução de Aaron não seja dimensionado bem à medida que o tamanho da entrada aumentar. (Tentei adicionar um índice à tabela temporária, mas isso não ajudou.)
Essa solução, como muitas outras coisas, é uma troca:
Edição: Bem, fui tentar ver se isso realmente era melhor, e verifica-se que o requisito de que os comentários estejam em uma ordem específica não é atualmente possível satisfazer usando uma função agregada. :(
Consulte SqlUserDefinedAggregateAttribute.IsInvariantToOrder . Basicamente, o que você precisa fazer é,
OVER(PARTITION BY customer_code ORDER BY row_num)
masORDER BY
não é suportado naOVER
cláusula ao agregar. Suponho que adicionar essa funcionalidade ao SQL Server abra uma lata de worms, porque o que precisaria ser alterado no plano de execução é trivial. O link mencionado acima diz que isso é reservado para uso futuro; portanto, isso pode ser implementado no futuro (em 2005, você provavelmente está sem sorte).Isso ainda pode ser feito compactando e analisando o
row_num
valor na cadeia de caracteres agregada e, em seguida, fazendo a classificação dentro do objeto CLR ... o que parece bastante tolo.De qualquer forma, abaixo está o código que eu usei caso alguém ache isso útil, mesmo com a limitação. Vou deixar a parte de hackers como um exercício para o leitor. Observe que eu usei o AdventureWorks (2005) para dados de teste.
Montagem agregada:
T-SQL para teste (
CREATE ASSEMBLY
esp_configure
para ativar o CLR omitido):fonte
Aqui está uma solução baseada em cursor que garante a ordem dos comentários por
row_num
. (Veja minha outra resposta para saber como a[dbo].[Comments]
tabela foi preenchida.)fonte
fonte