Когда значения столбцов равны, тогда value, в противном случае NULL при ГРУППИРОВАНИИ

#sql #sql-server #tsql #count #distinct

#sql #sql-сервер #tsql #количество #distinct

Вопрос:

У меня есть следующая таблица:

 DECLARE @tbl TABLE
(
    Col_1 VARCHAR(50),
    Col_2 VARCHAR(50),
    Col_3 VARCHAR(50)
);
  

и образец данных:

 INSERT INTO @tbl
(
    Col_1,
    Col_2,
    Col_3
)
VALUES
  ('1', '2', '3')
, ('1', '2', '3')
, ('1', '21', '4')
, ('1', '21', '5')
, ('1', '31', '8')
, ('1', '31', '8')
, ('1', '31', '8')
, ('3', '41', '1')
, ('3', '41', '2')
  

Я хочу получить col_3 , когда все значения равны, в противном случае это должно быть NULL , когда я группирую по col_1 , col_2 . Таким образом, желаемый результат выглядит следующим образом:

 Col_1   Col_2   Col_3
1         2      3
1         21     NULL
1         31     8
3         41     NULL 
  

Что мне удалось сделать, так это просто подсчитать уникальные значения, однако я не могу получить значение col_3

 SELECT 
  t.Col_1
, t.Col_2
, COUNT(DISTINCT t.Col_3) AS DistinctCount
FROM @tbl AS t
GROUP BY t.Col_1,
         t.Col_2
         
  

Любая помощь будет принята с благодарностью!

Ответ №1:

Вы можете использовать агрегацию и case выражение. Я бы рекомендовал:

 select col_1, col_2, 
    case when min(col_3) = max(col_3) then min(col_3) end col_3
from @tbl
group by col_1, col_2
  

Вы также можете использовать count(distinct) , как и в вашей первоначальной попытке:

 select col_1, col_2, 
    case when count(distinct col_3) = 1 then min(col_3) end col_3
from @tbl
group by col_1, col_2
  

Однако я подозреваю, что первый запрос более эффективен. COUNT(DISTINCT) довольно дорого.

Ответ №2:

Используйте CASE выражение:

 SELECT t.Col_1, t.Col_2,
       (CASE WHEN MIN(t.col_3) = MAX(t.col3) THEN MIN(t.col_3) END) as col_3
FROM @tbl t
GROUP BY t.Col_1, t.Col_2