Вопрос

У меня есть TSQL SELECT, который может возвращать ноль.Я попытался использовать ISNULL, чтобы заменить его на 0, но по какой-то причине это не работает.Таблица выбора имеет следующие столбцы:

  • идентификатор магазина --> целое число
  • штрафПроцент --> десятичный (9,2)
  • штрафДата --> ДатаВремя
SELECT  ISNULL(penaltyPercent, 0.0) AS penaltyPercent  
FROM    dbo.Penalty  
WHERE   (penaltyDate = (SELECT     MAX(penaltyDate) AS date  
                        FROM       dbo.Penalty AS Penalty_1  
                        WHERE      (penaltyDate <= @date) AND (storeID = @storeID))) AND
        (storeID = @storeID) 

Если дата предшествует первой дате штрафа (когда должно быть 0 штрафов), результат не возвращается.Не знаю, почему это не работает.У меня есть работа, но она меня беспокоит.

Вот пример используемых данных:

storeID  penaltyDate             penaltyPercent  
182      10/1/2008 12:00:00 AM   0.020000  
182      11/1/2008 12:00:00 AM   0.040000  
182      12/1/2008 12:00:00 AM   0.070000  
Это было полезно?

Решение

Когда вы говорите «Когда дата предшествует первой дате штрафа», вы имеете в виду, когда значение @date меньше значения, возвращаемого этим запросом?

SELECT MIN(penaltyDate)
FROM Penalty

Потому что тогда ваш внутренний запрос будет возвращать значение null, и (если вы используете значения NULL ANSI) эта часть вернет false,

WHERE (penaltyDate = ...

Потому что сравнения с нулем всегда возвращают ноль.Таким образом, вместо выбора одной строки с нулевым значением вы не выбираете ни одной строки.

Приложение:

Чтобы убедиться, что проблема в этом, измените первую строку внешнего запроса на

SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent

Это будет работать благодаря тому, что я описал выше.

Другие советы

Если @date < penalDate, то строка не возвращается, поэтому для ISNULL нет значения, на которое можно было бы воздействовать.Возможно, вы захотите выбрать процент штрафа в переменной, а затем выбрать его в наборе результатов. ISNULL(@pentaltyPercent).

У вас действительно есть данные, что эта дата предшествует первой дате взыскания?Если ваш запрос не возвращает записи, ваше предложение IsNull сделает что угодно, потому что оно работает против чего угодно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top