Выберите запрос Logic sql server - PullRequest
0 голосов
/ 02 июля 2019

У меня ниже таблица с данными,

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: Если у меня есть только один Country_Code для Emp_Id, нет необходимости ОБНОВЛЯТЬ таблицу для этого Emp_Id.(например, Emp_Id = 101)
  2. Случай 2: Если счетчик Country_Code одинаков (в нашем случае emp_id: 103), нам нужно ОБНОВИТЬ код страны_значения как "ноль" для этого emp_id
  3. Случай 3: Если счетчик Country_Code отличается (в нашем случае emp_id: 102), нам нужно ОБНОВИТЬ наибольшее значение Country_Code страны для этого Emp_Id.
  4. Случай 4: Если счетчик Country_code отличается (в нашем случаеemp_id: 104) и наибольшее число также больше 1, нам нужно обновить и код страны как ноль для этого 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

1 Ответ

1 голос
/ 02 июля 2019

Следующий запрос должен делать то, что вы хотите:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...