/ / SQL Server: O GROUP CONCAT com DISTINCT está classificando a entrada natural de dados - sql, sql-server, group-concat, for-xml-path

SQL Server: O GROUP CONCAT com DISTINCT está classificando a entrada natural de dados - sql, sql-server, group-concat, for-xml-path

Eu tenho uma situação parecida. Começo com uma tabela que possui entrada de dados em uma coluna de outra fonte. Esses dados são delimitados por vírgula. Preciso manipular os dados para remover uma seção no final de cada um. Então, eu divido os dados e removo o final com o código abaixo. (Adicionei a coluna ID mais tarde para poder classificar. Também adicionei WITH SCHEMABINDING mais tarde para adicionar um índice XML, mas nada funciona. Eu posso remover isso ... e o ID coluna, mas não vejo diferença de uma maneira ou de outra):

ALTER VIEW [dbo].[vw_Routing]
WITH SCHEMABINDING
AS
SELECT TOP 99.9999 PERCENT
ROW_NUMBER() OVER (ORDER BY CableID) - 1 AS ID,
CableID AS [CableID],
SUBSTRING(m.n.value(".[1]", "varchar(8000)"), 1, 13) AS Routing
FROM
(SELECT
CableID,
CAST("<XMLRoot><RowData>" + REPLACE([RouteNodeList], ",", "</RowData><RowData>") + "</RowData></XMLRoot>" AS xml) AS x
FROM
[dbo].[Cables]) t
CROSS APPLY
x.nodes("/XMLRoot/RowData") m (n)
ORDER BY
ID)

Agora preciso concatenar os dados do Routing linhas da coluna em uma linha agrupada por outracoluna em uma coluna novamente. Eu tenho o código funcionando, exceto que ele está reorganizando meus dados; Devo ter os dados na ordem em que são inseridos na tabela, pois são informações de roteamento de cabos. Também devo remover duplicatas. Eu uso o seguinte código. o SELECT DISTINCT remove as duplicatas, mas reordena os dados. o SELECT (sem DISTINCT) mantém a ordem correta dos dados, mas NÃO remove as duplicatas:

Substring(
(
SELECT DISTINCT ","+ x3.Routing  AS [text()] --This DISTINCT reorders the routes once concatenated.
--SELECT  ","+ x3.Routing  AS [text()] --This without the DISTINCT does not remove duplicates.
From vw_Routing x3
Where x3.CableID = c.CableId
For XML PATH ("")
), 2, 1000) [Routing],

Eu tentei o código que você forneceu acima e ele forneceu os mesmos resultados com o DISTINCT reordenar os dados, mas sem DISTINCT não removendo as duplicatas.

Respostas:

0 para resposta № 1

Possivelmente GROUP BY com ORDER BY vai funcionar:

stuff((select ","+ x3.Routing AS [text()] --This DISTINCT reorders the routes once concatenated.
--SELECT  ","+ x3.Routing  AS [text()] --This without the DISTINCT does not remove duplicates.
from vw_Routing x3
where x3.CableID = c.CableId
group by x3.Routing
order by min(x3.id)
for XML PATH ("")
), 1, 1, "") as [Routing],

Eu também substituí o SUBSTRING() com STUFF(). Este último é mais padrão para esta operação.


0 para resposta № 2

Para https://stackoverflow.com/users/1144035/gordon-linoff Infelizmente, isso não funcionou. Isso me deu o mesmo resultado que minha instrução select; isto é, sem duvidosos, mas reorganizando dados.

No entanto, encontrei a resposta correta hoje cedo:

Eu descobri finalmente !! Eu ainda tenho que implementá-lo dentro do outro código e adicionar o novo código da área do cabo, mas a parte difícil acabou !!!!!

Vou postar o seguinte nos fóruns para que eles saibam não trabalhar nele ... Eu estava escrevendo isso para enviar ao meu amigo por sua ajuda, mas descobri antes de enviá-lo.

Comecei com dados brutos separados por vírgula noregistros de uma tabela ... os dados são de outra fonte. Eu tive que remover algumas informações de cada valor, então usei o seguinte código para dividi-las e manipulá-las: Code1

Feito isso, eu tive que colocar o manipuladodados de volta na mesma forma, na mesma ordem e sem duplicatas. Então, eu precisava de um SELECT DISTINCT. Quando usei o SELECT DISTINCT comentado abaixo, ele removeu duplicatas, mas mudou a ordem dos dados que eu não podia ter, pois são dados de roteamento da bandeja de cabos. Quando tirei o SELECT DISTINCT, ele manteve a ordem correta, mas deixou duplicatas.

Como eu estava usando o XML PATH, tive que alterar esse código …… Para esse código para poder usar SELECT DISTINCT e remover as duplicatas:Código2 e Código3