我想要最多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
答案 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
函数:
count(*)
时,所有行都是count(也是空值)count(someFieldName)
时,只有非空值的行才会计数您可以使用问题
中的示例数据在此示例中看到此不同的行为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