Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

अल्पविराम या पाइपलाइन ऑपरेटर स्ट्रिंग से डुप्लिकेट निकालें

दृष्टिकोण

मूल्यों की एक सीमित सूची को डी-डुप्लिकेट करने के लिए निम्नलिखित दृष्टिकोण का उपयोग किया जा सकता है।

  1. REPLACE() का उपयोग करें विभिन्न सीमांककों को एक ही सीमांकक में बदलने का कार्य करता है।
  2. REPLACE() का उपयोग करें एक्सएमएल खंड बनाने के लिए एक्सएमएल क्लोजिंग और ओपनिंग टैग इंजेक्ट करने के लिए कार्य करता है
  3. CAST(expr AS XML) का उपयोग करें उपरोक्त खंड को XML डेटा प्रकार में बदलने के लिए कार्य करता है
  4. OUTER APPLY का उपयोग करें तालिका-मूल्यवान फ़ंक्शन को लागू करने के लिए nodes() एक्सएमएल खंड को उसके घटक एक्सएमएल टैग में विभाजित करने के लिए। यह प्रत्येक XML टैग को एक अलग पंक्ति पर लौटाता है।
  5. value() . का उपयोग करके XML टैग से केवल मान निकालें फ़ंक्शन, और निर्दिष्ट डेटा प्रकार का उपयोग करके मान लौटाता है।
  6. उपरोक्त मान के बाद अल्पविराम लगाएं।
  7. ध्यान दें कि ये मान अलग-अलग पंक्तियों में दिए गए हैं। DISTINCT . का उपयोग कीवर्ड अब डुप्लिकेट पंक्तियों (यानी मान) को हटा देता है।
  8. FOR XML PATH('') के लिए उपयोग करें एकाधिक पंक्तियों में मानों को एक पंक्ति में संयोजित करने के लिए खंड।

क्वेरी

उपरोक्त दृष्टिकोण को क्वेरी फॉर्म में रखना:

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('') 

इनपुट और परिणाम

इनपुट को देखते हुए:

उपरोक्त क्वेरी परिणाम लौटाएगी:

अंत में अनुगामी अल्पविराम पर ध्यान दें। इसे हटाने के लिए मैं इसे आप पर एक अभ्यास के रूप में छोड़ता हूँ।

संपादित करें:डुप्लिकेट की संख्या

ओपी ने एक टिप्पणी में अनुरोध किया "मैं डुप्लिकेट की t5he गिनती कैसे प्राप्त करूं? एक अलग कॉलम में ".

उपरोक्त क्वेरी का उपयोग करने का सबसे आसान तरीका होगा लेकिन अंतिम पंक्ति को हटा दें 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 
    -- 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) 

ऊपर दिखाए गए समान इनपुट के लिए, इस क्वेरी का आउटपुट है:

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. URL से रिपोर्ट जनरेट करें - SQL सर्वर रिपोर्टिंग सेवाएँ 2008

  2. आईडी कॉलम के आधार पर पंक्तियों को कॉलम में स्थानांतरित करें

  3. स्वचालित संस्करण संख्या .Dtsx फ़ाइलों से पुनर्प्राप्ति

  4. मिनटों की संख्या को एचएच में कैसे बदलें:टीएसक्यूएल में मिमी प्रारूप?

  5. SSRS रिपोर्ट परिभाषा सर्वर से नई है