2016-07-30 18 views
1

最大startdateが必要ですが、データはNULLです。nullになります。MAXと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

この問題を解決するために、我々は2つのケースで異なる振る舞いcount機能を使用することができます:私たちはcount(*)を使用する場合、すべての行が

  • (もNULL値で)、カウントされている

    1. のときに我々 count(someFieldName)を使用すると、ヌル値でない行のみがカウントされます。

    この例では、出力で質問

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

    からのサンプルデータを歌う私たちは、このクエリによって質問から問題を解決するには

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

    をこの異なる動作を使用することができ、この

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

    を見ることができます所望の結果を出力することができる。

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