当列值等于则值,否则在 GROUPING 时为 NULL

When column values are equal then value, otherwise NULL while GROUPING

我有以下 table:

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,否则当我按col_1col_2分组时应该是NULL。所以期望的结果如下所示:

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
         

如有任何帮助,我们将不胜感激!

您可以使用聚合和 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) 挺贵的。

使用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