मेरे पास डेटा के साथ तालिका के नीचे है,

Emp_ID      Country_Code
101          AE
101          AE
102          AE
102          SG
102          AE
103          AE
103          AE
103          SG
103          SG
104          AE
104          AE
104          SG
104          SG
104          HK

अगर मैं Emp_Id और देश के आधार पर ग्रुप करता हूं, तो मैं नीचे दिए गए परिणाम सेट प्राप्त कर सकता हूं,

Emp_ID        Country_Code       count
101           AE                  2
102           AE                  2
102           SG                  1
103           AE                  2
103           SG                  2
104           AE                  2
104           HK                  1
104           SG                  2

इस परिणाम सेट में मेरे पास 4 परिदृश्य हैं,

  1. केस 1: यदि मेरे पास Emp_Id के लिए केवल एक Country_Code है, तो उस Emp_Id के लिए तालिका को अपडेट करने की कोई आवश्यकता नहीं है। (जैसे।, Emp_Id = १०१)
  2. केस 2: अगर Country_Code की संख्या समान है (हमारे मामले में emp_id: 103), तो हमें उस emp_id के लिए देश_कोड को "null" के रूप में अपडेट करना होगा
  3. केस ३: यदि देश_कोड की संख्या अलग है (हमारे मामले में emp_id: १०२), तो हमें उस Emp_Id के लिए देश_कोड की उच्चतम संख्या को अद्यतन करने की आवश्यकता है।
  4. केस ४: यदि कंट्री_कोड काउंट अलग है (हमारे मामले में emp_id: १०४) और उच्चतम काउंट भी १ से अधिक है, तो हमें उस emp_id के लिए कंट्री_कोड को शून्य के रूप में अपडेट करना होगा।

अपेक्षित आउटपुट

Emp_ID      Country_Code
101          AE
101          AE
102          AE
102          AE
102          AE
103          NULL
103          NULL
103          NULL
103          NULL
104          NULL
104          NULL
104          NULL
104          NULL
104          NULL
0
Srinivasan 2 जुलाई 2019, 08:27

1 उत्तर

सबसे बढ़िया उत्तर

निम्नलिखित क्वेरी को वही करना चाहिए जो आप चाहते हैं:

CREATE TABLE #emp (Emp_ID INT,Country_Code VARCHAR(10))
INSERT INTO #emp VALUES
(101,'AE'),(101,'AE'),  -- Case 1
(102,'AE'),(102,'SG'),(102,'AE'),   -- Case 3
(103,'AE'),(103,'AE'),(103,'SG'),(103,'SG'),    -- Case 2
(104,'IN'), -- Case 1
(105,'AB'),(105,'AB'),(105,'BC'),(105,'BC'),(105,'CD'),(105,'CD'),  -- Case 2
(106,'CD'),(106,'IJ'),(106,'IJ'),   -- Case 3
(107,'AA'),(107,'BB'),(107,'CC'),   -- Case 2
(108,'AE'),(108,'AE'),(108,'SG'),(108,'SG'),(108,'HK'), -- Case 4
(109,'ZZ'),(109,'ZZ'),(109,'YY'),(109,'XX') -- Case 3

UPDATE t
SET Country_Code = CASE WHEN cnt = 1 AND dst_cnt = 1 THEN Country_Code  -- Case 1
                        WHEN cnt > 1 AND dst_cnt = 1 THEN NULL  -- Case 2
                        WHEN cnt > 1 AND dst_cnt <> 1 THEN (SELECT TOP 1 CASE WHEN cnt = lead(cnt) OVER( ORDER BY (cnt)) THEN NULL ELSE Country_Code END 
                                                            FROM ( SELECT Country_Code, RANK() OVER (ORDER BY COUNT(*) DESC) cnt FROM #emp WHERE Emp_ID = t.Emp_ID
                                                                   GROUP BY Country_Code ) A WHERE cnt = 1) END -- Case 3 & 4  
FROM #emp t
JOIN (
    SELECT Emp_ID
        ,COUNT(cnt) AS cnt
        ,COUNT(DISTINCT cnt) AS dst_cnt
    FROM (SELECT Emp_ID
            ,Country_Code
            ,COUNT(Country_Code) AS cnt
        FROM #emp
        GROUP BY Emp_ID,Country_Code) a
    GROUP BY Emp_ID 
    ) b ON t.Emp_ID = b.Emp_ID

SELECT * FROM #emp
ORDER BY Emp_ID
1
MJoy 3 जुलाई 2019, 13:20