/ / SQL Server: GROUP CONCAT con DISTINCT sta ordinando l'input di dati naturali - sql, sql-server, group-concat, for-xml-path

SQL Server: GROUP CONCAT con DISTINCT sta ordinando l'input di dati naturali - sql, sql-server, group-concat, for-xml-path

Ho una situazione simile. Comincio con una tabella che ha input di dati in una colonna da un'altra fonte. Questi dati sono delimitati da virgole in arrivo. Devo manipolare i dati per rimuovere una sezione alla fine di ciascuno. Quindi ho diviso i dati e ho rimosso la fine con il codice qui sotto. (Ho aggiunto la colonna ID in seguito per poter ordinare. Ho anche aggiunto WITH SCHEMABINDING in seguito per aggiungere un indice XML ma non funziona nulla. Posso rimuovere questo ... e il ID colonna, ma non vedo alcuna differenza in un modo o nell'altro):

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)

Ora ho bisogno di concatenare i dati dal Routing le righe della colonna in una riga raggruppate per un'altracolonna in una colonna di nuovo. Ho il codice funzionante tranne per il fatto che sta riordinando i miei dati; Devo avere i dati nell'ordine in cui sono inseriti nella tabella in quanto sono le informazioni sul percorso dei cavi. Devo anche rimuovere i duplicati. Io uso il seguente codice. Il SELECT DISTINCT rimuove i duplicati, ma riordina i dati. Il SELECT (senza DISTINCT) mantiene l'ordine dei dati corretto, ma NON rimuove i duplicati:

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],

Ho provato il codice che hai dato sopra e ha fornito gli stessi risultati con il DISTINCT riordinare i dati ma senza DISTINCT non rimuovere i duplicati.

risposte:

0 per risposta № 1

Forse GROUP BY con ORDER BY funzionerà:

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],

Ho anche sostituito il SUBSTRING() con STUFF(). Quest'ultimo è più standard per questa operazione.


0 per risposta № 2

A https://stackoverflow.com/users/1144035/gordon-linoff Sfortunatamente, non ha funzionato. Mi ha dato lo stesso risultato della mia dichiarazione selezionata; cioè, niente duplicati ma riordinare i dati.

TUTTAVIA, oggi ho trovato la risposta corretta oggi:

L'ho capito finalmente !! Devo ancora implementarlo all'interno dell'altro codice e aggiungere il nuovo codice Area cavo, ma la parte difficile è finita !!!!!

Pubblicherò quanto segue nei forum in modo che sappiano di non lavorarci su .... Stavo scrivendo questo per inviarlo al mio amico per il suo aiuto, ma l'ho capito da solo prima di inviarlo.

Ho iniziato con i dati grezzi, separati da virgola nelrecord di una tabella ... i dati provengono da un'altra fonte. Ho dovuto rimuovere alcune delle informazioni da ciascun valore, quindi ho usato il seguente codice per dividerlo e manipolarlo: code1

Una volta fatto ciò, ho dovuto mettere il manipolatoi dati vengono restituiti nello stesso modulo nello stesso ordine e senza duplicati. Quindi avevo bisogno di un DISTINCT SELEZIONATO. Quando ho usato il SELEZIONATO DISTINTO commentato di seguito, ha rimosso i duplicati ma ha cambiato l'ordine dei dati che non avrei potuto avere in quanto sono i dati di instradamento dei vassoi per cavi. Quando ho estratto SELECT DISTINCT, ha mantenuto l'ordine corretto, ma ha lasciato dei duplicati.

Dato che stavo usando XML PATH, ho dovuto cambiare questo codice …… In questo codice per poter usare SELECT DISTINCT rimuovere i duplicati:Codice2 e Codice3