MAX的GROUP BY和NULL

时间:2016-07-30 08:52:41

标签: tsql sql-server-2014

我想要最多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

2 个答案:

答案 0 :(得分:1)

找到结果。

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

答案 1 :(得分:1)

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

  1. 当我们使用count(*)时,所有行都是count(也是空值)
  2. 当我们使用count(someFieldName)时,只有非空值的行才会计数
  3. 您可以使用问题

    中的示例数据在此示例中看到此不同的行为
    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