/ / SQL Server: GROUP CONCAT mit DISTINCT sortiert die Eingabe natürlicher Daten - SQL, SQL Server, Group Concat, For-XML-Pfad

SQL Server: GROUP CONCAT mit DISTINCT sortiert die Eingabe natürlicher Daten - sql, sql-server, group-concat, for-xml-path

Ich habe eine ähnliche Situation. Ich beginne mit einer Tabelle, in die Daten aus einer anderen Quelle in eine Spalte eingegeben wurden. Diese Daten werden durch Kommas getrennt. Ich muss die Daten bearbeiten, um jeweils einen Abschnitt am Ende zu entfernen. Also habe ich die Daten aufgeteilt und das Ende mit dem folgenden Code entfernt. (Ich habe die ID-Spalte später hinzugefügt, um sortieren zu können. Ich habe auch hinzugefügt WITH SCHEMABINDING später, um einen XML-Index hinzuzufügen, aber nichts funktioniert. Ich kann das entfernen ... und das ID Spalte, aber ich sehe keinen Unterschied auf die eine oder andere Weise):

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)

Jetzt muss ich Daten aus dem verketten Routing Spaltenzeilen in eine Zeile gruppiert nach einer anderenSpalte wieder in eine Spalte. Ich habe den Code funktioniert, außer dass er meine Daten neu ordnet; Ich muss die Daten in der Reihenfolge haben, in der sie in die Tabelle eingegeben werden, da es sich um Kabelführungsinformationen handelt. Ich muss auch Duplikate entfernen. Ich benutze den folgenden Code. Das SELECT DISTINCT Entfernt die Duplikate, ordnet die Daten jedoch neu. Das SELECT (ohne DISTINCT) behält die korrekte Datenreihenfolge bei, entfernt jedoch NICHT die Duplikate:

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

Ich habe den oben angegebenen Code ausprobiert und er lieferte die gleichen Ergebnisse mit dem DISTINCT Neuordnung der Daten aber ohne DISTINCT die Duplikate nicht entfernen.

Antworten:

0 für die Antwort № 1

Vielleicht GROUP BY mit ORDER BY wird funktionieren:

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

Ich habe auch das ersetzt SUBSTRING() mit STUFF(). Letzteres ist Standard für diese Operation.


0 für die Antwort № 2

Zu https://stackoverflow.com/users/1144035/gordon-linoff Das hat leider nicht funktioniert. Es gab mir das gleiche Ergebnis wie meine select-Anweisung; Das heißt, keine Dups, sondern das Neuordnen von Daten.

Ich habe heute jedoch die richtige Antwort gefunden:

Ich habe es endlich herausgefunden !! Ich muss es noch in den anderen Code implementieren und die neue Kabelvorwahl hinzufügen, aber der schwierige Teil ist vorbei !!!!!

Ich werde Folgendes in die Foren posten, damit sie wissen, dass sie nicht daran arbeiten sollen ... Ich habe dies geschrieben, um es meinem Freund für seine Hilfe zu senden, aber ich habe es selbst herausgefunden, bevor ich es gesendet habe.

Ich begann mit rohen, durch Kommas getrennten Daten in derDatensätze einer Tabelle… die Daten stammen aus einer anderen Quelle. Ich musste einige der Informationen aus jedem Wert entfernen, also habe ich den folgenden Code verwendet, um sie aufzuteilen und zu bearbeiten: Code1

Sobald das erledigt war, musste ich die manipulierten setzenDaten in derselben Form in derselben Reihenfolge und ohne Duplikate zurück. Also brauchte ich einen SELECT DISTINCT. Als ich das unten auskommentierte SELECT DISTINCT verwendet habe, wurden Duplikate entfernt, aber die Reihenfolge der Daten geändert, die ich nicht haben konnte, da es sich um Kabelrinnen-Routing-Daten handelt. Als ich das SELECT DISTINCT herausnahm, behielt es die richtige Reihenfolge bei, hinterließ aber Duplikate.

Da ich XML PATH verwendet habe, musste ich diesen Code ändern ... Um diesen Code zu verwenden, damit ich SELECT DISTINCT verwenden kann, entferne die Duplikate:Code2 und Code3