Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

hapus duplikat dari koma atau string operator pipa

Pendekatan

Pendekatan berikut dapat digunakan untuk menghapus duplikat daftar nilai yang dibatasi.

  1. Gunakan REPLACE() berfungsi untuk mengubah pembatas yang berbeda menjadi pembatas yang sama.
  2. Gunakan REPLACE() berfungsi untuk menginjeksi tag penutup dan pembuka XML untuk membuat fragmen XML
  3. Gunakan CAST(expr AS XML) berfungsi untuk mengubah fragmen di atas menjadi tipe data XML
  4. Gunakan OUTER APPLY untuk menerapkan fungsi bernilai tabel nodes() untuk membagi fragmen XML menjadi tag XML penyusunnya. Ini mengembalikan setiap tag XML pada baris terpisah.
  5. Ekstrak nilai saja dari tag XML menggunakan value() fungsi, dan mengembalikan nilai menggunakan tipe data yang ditentukan.
  6. Tambahkan koma setelah nilai yang disebutkan di atas.
  7. Perhatikan bahwa nilai-nilai ini dikembalikan pada baris terpisah. Penggunaan DISTINCT kata kunci sekarang menghapus baris duplikat (yaitu nilai).
  8. Gunakan FOR XML PATH('') klausa untuk menggabungkan nilai di beberapa baris menjadi satu baris.

Kueri

Menempatkan pendekatan di atas dalam bentuk kueri:

SELECT DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)') + ',' 
FROM ( 
        -- This query returns the following in theDataXml column: 
        -- <tag>test1</tag><tag>test2</tag><tag>test1</tag><tag>test2</tag><tag>test3</tag><tag>test4</tag><tag>test4</tag><tag>test4</tag>
        -- i.e. it has turned the original delimited data into an XML fragment 
        SELECT 
          DataTable.DataColumn AS DataRaw 
        , CAST( 
            '<tag>' 
            -- First replace commas with pipes to have only a single delimiter 
            -- Then replace the pipe delimiters with a closing and opening tag 
            + replace(replace(DataTable.DataColumn, ',','|'), '|','</tag><tag>') 
            -- Add a final set of closing tags 
            + '</tag>' 
            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) 
-- Running the query without the following line will return the data in separate rows 
-- Running the query with the following line returns the rows concatenated, i.e. it returns: 
-- test1,test2,test3,test4, 
FOR XML PATH('') 

Masukan &Hasil

Diberikan masukan:

Kueri di atas akan mengembalikan hasilnya:

Perhatikan tanda koma di akhir. Saya akan meninggalkannya sebagai latihan bagi Anda untuk menghapusnya.

EDIT:Hitungan Duplikat

OP diminta dalam komentar "bagaimana cara mendapatkan jumlah duplikat juga? di kolom terpisah ".

Cara paling sederhana adalah dengan menggunakan kueri di atas tetapi hapus baris terakhir FOR XML PATH('') . Kemudian, menghitung semua nilai dan nilai berbeda yang dikembalikan oleh SELECT ekspresi dalam kueri di atas (yaitu PivotedTable.PivotedColumn.value('.','nvarchar(max)') ). Perbedaan antara jumlah semua nilai dan jumlah nilai yang berbeda adalah jumlah nilai duplikat.

SELECT 
    COUNT(PivotedTable.PivotedColumn.value('.','nvarchar(max)'))            AS CountOfAllValues 
  , COUNT(DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)'))   AS CountOfUniqueValues 
    -- The difference of the previous two counts is the number of duplicate values 
  , COUNT(PivotedTable.PivotedColumn.value('.','nvarchar(max)')) 
    - COUNT(DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)')) AS CountOfDuplicateValues 
FROM ( 
        -- This query returns the following in theDataXml column: 
        -- <tag>test1</tag><tag>test2</tag><tag>test1</tag><tag>test2</tag><tag>test3</tag><tag>test4</tag><tag>test4</tag><tag>test4</tag>
        -- i.e. it has turned the original delimited data into an XML fragment 
        SELECT 
          DataTable.DataColumn AS DataRaw 
        , CAST( 
            '<tag>' 
            -- First replace commas with pipes to have only a single delimiter 
            -- Then replace the pipe delimiters with a closing and opening tag 
            + replace(replace(DataTable.DataColumn, ',','|'), '|','</tag><tag>') 
            -- Add a final set of closing tags 
            + '</tag>' 
            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) 

Untuk input yang sama seperti yang ditunjukkan di atas, output dari kueri ini adalah:

CountOfAllValues CountOfUniqueValues CountOfDuplicateValues
---------------- ------------------- ----------------------
8                4                   4


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Duplikat yang tidak dapat dipercaya dalam Kueri Kerangka Entitas

  2. Pemfilteran SQL Server 2008

  3. Bagaimana cara melakukan pencarian peka huruf besar/kecil menggunakan LIKE?

  4. Mengelompokkan total pengguna aktif untuk masing-masing dari 8 minggu sebelumnya

  5. RADIANS() Contoh di SQL Server