/ / SQL Server:DISTINCTを使用したGROUP CONCATは、自然なデータ入力を並べ替えています-sql、sql-server、group-concat、for-xml-path

SQL Server:DISTINCTを使用したGROUP CONCATは、自然データ入力をソートしています-sql、sql-server、group-concat、for-xml-path

私も同じような状況にあります。 別のソースから列にデータが入力されているテーブルから始めます。このデータはカンマ区切りで入力されます。データを操作して、それぞれの最後のセクションを削除する必要があります。そこで、データを分割し、以下のコードで末尾を削除します。 (後で並べ替えるためにID列を追加しました。また追加しました WITH SCHEMABINDING 後でXMLインデックスを追加しますが、何も機能しません。私はこれを取り除くことができます...そして ID 列ですが、どちらの方法でも違いは見られません):

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)

次に、からのデータを連結する必要があります Routing 列の行を別の行でグループ化された1つの行に再び列に列を入れます。データを並べ替えていることを除いて、コードは機能しています。ケーブルルーティング情報であるため、テーブルに入力された順序でデータを取得する必要があります。重複も削除する必要があります。私は次のコードを使用します。ザ・ SELECT DISTINCT 重複を削除しますが、データを並べ替えます。ザ・ SELECT (なし DISTINCT)正しいデータ順序を維持しますが、重複は削除しません。

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

私はあなたが上で与えたコードを試しました、そしてそれは同じ結果を提供しました DISTINCT データを並べ替えますが、 DISTINCT 重複を削除しません。

回答:

回答№1は0

おそらく GROUP BY 〜と ORDER BY 働くでしょう:

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

私も交換しました SUBSTRING() 〜と STUFF()。後者は、この操作のより標準的です。


回答№2の場合は0

https://stackoverflow.com/users/1144035/gordon-linoff 残念ながら、それはうまくいきませんでした。 selectステートメントと同じ結果が得られました。つまり、重複はありませんが、データを並べ替えます。

しかし、私は今日早くに正しい答えを見つけました:

やっとわかった!!私はまだ他のコード内にそれを実装し、新しいケーブルエリアコードを追加する必要がありますが、難しい部分はそれを超えています!!!!!

以下をフォーラムに投稿して、彼らがそれに取り組んでいないことを知ってもらうつもりです....私は友人に助けを求めるためにこれを書いていましたが、送信する前に自分で理解しました。

生のカンマ区切りデータから始めましたテーブルのレコード…データは別のソースからのものです。各値から一部の情報を削除する必要があったため、次のコードを使用して情報を分割して操作しました。 Code1

それが終わったら、私は操作されたものを置かなければなりませんでした同じ形式で同じ順序で重複のないデータ。そのため、SELECTDISTINCTが必要でした。以下のコメントアウトされたSELECTDISTINCTを使用すると、重複が削除されましたが、ケーブルトレイルーティングデータであるため、取得できなかったデータの順序が変更されました。 SELECT DISTINCTを取り出したとき、正しい順序を保っていましたが、重複が残っていました。

XML PATHを使用していたため、このコードを変更する必要がありました……SELECT DISTINCTを使用できるように、このコードに重複を削除します。Code2およびCode3