Вопрос: SQL Server Возвращает Null, если существует


В SQL Server 2008 я ищу создать запрос, который будет возвращать NULL в совокупности, если таковой существует, иначе я ищу максимум. Это упрощенный пример ...

У меня есть следующие данные:

    CO  Loc Term_Dt
    1   A   7/15/2013
    1   B
    1   C   10/30/2000
    2   A   8/10/2008
    2   B   6/1/2015
    2   C   4/30/2010

Результат, который я ищу, это:

    CO  Term_Dt
    1   NULL
    2   6/1/2015

поскольку технически Компания по-прежнему остается открытой, если хотя бы одно место еще не прекращено.

благодаря


5


источник


Ответы:


Просто используйте агрегацию и case заявление:

select co,
       (case when count(term_dt) = count(*) then max(term_dt)
        end) as term_dt
from table t
group by co;

count(<column>) подсчитывает количество не- NULL значения. Если это не соответствует всем строкам, то по крайней мере один из них NULL, нет else необходимо для case, поскольку по умолчанию NULL,


5



Создайте подмножество данных с компаниями, имеющими даты нулевого срока и оставив их в своем супер-наборе. Любые записи в 2-й таблице, которые не являются нулевыми, вы хотите отобразить как null, поэтому используйте оператор case.

Это работает, потому что наша внешняя таблица (A) возвращается

CO TERM_DT  
1  7/15/2013
2  6/1/2015  

Но тогда наше ВЛЕВО участие в нашем встроенном представлении также добавляет B.Co ...

CO TERM_DT   B.CO
1  7/15/2013 1
2  6/1/2015  NULL

Поэтому вы можете видеть, что мы хотим отобразить NULL, когда B.CO не является нулевым, а не max (TERM_DT), даст желаемые результаты. Это выполняется с использованием case case.

SELECT A.Co, 
    Case when B.CO is not null then Max(A.Term_DT) else NULL end as Term_DT
FROM tableName A
LEFT JOIN (SELECT Distinct CO from tableName where Term_dt is null) B
 on A.Co = B.CO
GROUP BY CO

1