GROUP BY for MAX and NULL



我想要最大startdate,但有一个NULL数据,它将为空。

样本数据如下:

DECLARE @Tbl TABLE (Id INT, StartDate DATETIME)
INSERT INTO @Tbl
VALUES (1, NULL),
(1, '2016.07.30'),
(1, '2016.07.05'),
(1, '2016.07.05'),
(2, '2016.07.07'),
(2, '2016.07.05'),
(3, '2016.07.05'),
(3, NULL)

我的查询:

SELECT Id, MAX(StartDate) AS StartDate
FROM @Tbl
GROUP BY Id

输出:

Id          StartDate
----------- ----------
1           2016-07-30
2           2016-07-07
3           2016-07-05

期望输出:

Id          StartDate
----------- ----------
1           NULL
2           2016-07-07
3           NULL

为了解决这个问题,我们可以使用在两种情况下表现不同的count函数:

  1. 当我们使用count(*)时,所有行都是计数的(也有空值)
  2. 当我们使用count(someFieldName)时,只有值不为null的行才被计数

使用问题的样本数据,您可以在本示例中看到这种不同的行为

select Id, count(*) as count_all, count(StartDate) as count_StartDate
from @Tbl
group by Id;

在输出上,我们可以看到这个

Id  count_all   count_StartDate
1   4           3
2   2           2
3   2           1

我们可以通过这个查询使用这种不同的行为来解决一个又一个问题

select Id, case when count(*) = count(StartDate) 
                then max(StartDate) 
                else null 
                end as StartDate
from @Tbl
group by Id

在输出上,我们可以看到所需的结果

Id  StartDate
1   NULL
2   2016-07-07 00:00:00.000
3   NULL

找到结果。

SELECT Id, CASE 
                WHEN MAX(COALESCE(StartDate, '2099.01.01')) = '2099.01.01'  THEN NULL 
                ELSE MAX(StartDate) END AS StartDate
FROM @Tbl
GROUP BY Id

最新更新