アプローチ
次のアプローチを使用して、値の区切りリストの重複を排除できます。
<オール>REPLACE()
を使用する 異なる区切り文字を同じ区切り文字に変換する関数。 REPLACE()
を使用する XML の終了タグと開始タグを挿入して XML フラグメントを作成する関数CAST(expr AS XML)
を使用する 上記のフラグメントを XML データ型に変換する関数 OUTER APPLY
を使用 テーブル値関数 nodes()
を適用するには XML フラグメントを構成要素の XML タグに分割します。これにより、各 XML タグが個別の行に返されます。 value()
を使用して XML タグから値だけを抽出します 関数を呼び出し、指定されたデータ型を使用して値を返します。 DISTINCT
の使い方 キーワードは、重複する行 (つまり、値) を削除するようになりました。 FOR XML PATH('')
を使用する 句を使用して、複数の行にまたがる値を 1 つの行に連結します。 クエリ
上記のアプローチをクエリ形式にすると:
SELECT DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)') + ',' FROM ( -- このクエリは、DataXml 列に以下を返します:-- test1 test2 test1 test2 test3 test4 test4 test4 -- つまり、元の区切りデータを XML フラグメントに変換しました SELECT DataTable.DataColumn AS DataRaw , CAST( '' -- 最初にコンマをパイプに置き換えて、区切り文字を 1 つだけにします - - 次に、パイプ区切り文字を終了タグと開始タグに置き換えます + replace(replace(DataTable.DataColumn, ',','|'), '|',' ') -- 最終セットを追加します終了タグ + ' ' AS XML) AS DataXml FROM ( SELECT 'test1,test2,test1|test2,test3|test4,test4|test4' AS DataColumn) AS DataTable ) AS x OUTER APPLY DataXml.nodes(' tag') AS PivotedTable(PivotedColumn) -- 実行中次の行がないクエリは、データを別々の行に返します -- 次の行を含むクエリを実行すると、連結された行が返されます。つまり、以下が返されます:-- test1,test2,test3,test4, FOR XML PATH('')> プレ>
入力と結果
入力が与えられた場合:
上記のクエリは結果を返します:
末尾のコンマに注意してください。それを取り除くための演習として残します。
編集:重複の数
コメントで要求された OP 「どうすれば重複の数も取得できますか? 別の列で "。
最も簡単な方法は、上記のクエリを使用して、最後の行 FOR XML PATH('')
を削除することです。 .次に、SELECT
によって返されたすべての値と個別の値をカウントします。 上記のクエリの式 (つまり、PivotedTable.PivotedColumn.value('.','nvarchar(max)')
)。すべての値の数と個別の値の数の差が、重複値の数です。
SELECT COUNT(PivotedTable.PivotedColumn.value('.','nvarchar(max)')) AS CountOfAllValues , COUNT(DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)') ) AS CountOfUniqueValues -- 前の 2 つのカウントの差は、重複する値の数です。 .','nvarchar(max)')) AS CountOfDuplicateValues FROM ( -- このクエリは、DataXml 列に次を返します:-- test1 test2 test1 test2 test3 test4 test4 test4 -- つまり、元のデータを XML フラグメントに区切ります SELECT DataTable.DataColumn AS DataRaw , CAST( '' -- 最初にカンマをパイプに置き換えて、単一の区切り記号のみにします -- 次に、パイプ区切り記号を閉じと開きに置き換えますtag + replace(replace(DataTable.DataColumn, ',','|'), '|',' ') -- 最終セットの終了タグ + ' ' AS を追加しますXML) AS DataXml FROM ( SELECT 'test1,test2,test1|test2,test3|test4,test4|test4' AS DataColumn) AS DataTable ) AS x OUTER APPLY DataXml.nodes('tag') AS PivotedTable(PivotedColumn)
プレ>
上記と同じ入力に対して、このクエリの出力は次のようになります:
CountOfAllValues CountOfUniqueValues CountOfDuplicateValues---------------- ---------------------- ------ ----------------8 4 4コード> プレ>