Получение SELECT для возврата нуля в обоих случаях NULL и EMPTY строки в одном запросе SQL

Следующий запрос приводит к значению в виде одной строки либо как значение для ExtendedText, либо как ноль для соответствия LineNumber в данных таблицы. Мне нужно добавить еще одно условие в запрос, так как - если LineNumber не существует, вернуть одну строку как ноль, как в случае null. Запрос должен проверять как NULL, так и пустой, чтобы вернуть ноль

SELECT  ISNULL(Sum(convert(dec,DeliveryPaymentExtras.ExtendedText)),0) As ExtendedText
FROM    DeliveryPaymentExtras
WHERE   (LineNumber =21) group by LineNumber

person Murali Uppangala    schedule 06.11.2013    source источник
comment
Что произойдет, если вы удалите group by LineNumber?   -  person ypercubeᵀᴹ    schedule 06.11.2013
comment
@ypercube Да .. это сработало для меня :-) Пожалуйста, отредактируйте свой комментарий как ответ   -  person Murali Uppangala    schedule 06.11.2013


Ответы (2)


Если вы хотите получить результат только для одного значения LineNumber, как предлагает код, это тривиально. Просто удалите GROUP BY LineNumber. Агрегация без группы означает, что результатом будет ровно одна строка, независимо от того, есть ли у нас 0 или миллион строк перед агрегацией:

SELECT  ISNULL(Sum(convert(dec,DeliveryPaymentExtras.ExtendedText)),0) AS ExtendedText
FROM    DeliveryPaymentExtras
WHERE   (LineNumber =21) ;

Если вам нужны результаты для нескольких значений (например, если у вас было: WHERE LineNumber IN (21, 34, 55) GROUP BY LineNumber), это непросто. Один из способов:

SELECT  v.LineNumber,
        ISNULL(Sum(convert(dec,d.DeliveryPaymentExtras.ExtendedText)),0) 
            AS ExtendedText
FROM    ( VALUES (21),(34),(55)
        ) AS v (LineNumber)
    LEFT JOIN DeliveryPaymentExtras AS d
        ON d.LineNumber = v.LineNumber
GROUP BY v.LineNumber ;
person ypercubeᵀᴹ    schedule 06.11.2013
comment
+1 не заметил, что ваш второй ответ был похож на ответ, который я опубликовал (и удалил) - person t-clausen.dk; 06.11.2013

Выберите свое значение в переменной и выберите эту переменную.

Ваша проблема в том, что количество строк NULL не вызовет ваш ISNULL, который оценивает SUM, а не количество строк в запросе. Это другая механика.

Поэтому вам нужно будет выбрать сумму ISNULL в переменной, а затем выбрать ее в своем запросе:

Что-то вроде этого:

DECLARE @Result DECIMAL(18,4)
SET @Result = 
(
SELECT  Sum(convert(dec,DeliveryPaymentExtras.ExtendedText)) As ExtendedText
FROM    DeliveryPaymentExtras
WHERE   (LineNumber =21) group by LineNumber
(


SELECT ISNULL(@Result, 0)
person Allan S. Hansen    schedule 06.11.2013