#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