2016-07-30 2 views
1

최대 startdate을 원하지만 NULL 데이터가 있습니다. 이는 null입니다.최대 및 NULL에 대한 GROUP BY

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

재미를 위해서 :'dateadd (day, nullif (sign (count (*) - count (StartDate)), 1), max (StartDate))' – shawnt00

답변

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

이 문제를 해결하기 위해 우리는 두 가지 경우에 다른 행동 count 기능을 사용할 수 있습니다 : 우리가 count(*)를 사용할 때 모든 행이

  • 을 (널 값) 수가 있습니다

    1. 을 때 count(someFieldName)을 사용하면 NULL 값이 아닌 행만 카운트됩니다.

    이 예제에서는이 다른 동작을 볼 수 있습니다. u 우리는이

    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 
    

    에 의해 질문에서 문제를 해결하기 위해 다른 동작을 사용할 수 있습니다 볼 수 있습니다 출력에 문제

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

    에서 샘플 데이터를 노래 원하는 결과를 출력 할 수 있습니다.

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