Когда вы говорите «Когда дата предшествует первой дате штрафа», вы имеете в виду, когда значение @date
меньше значения, возвращенного этим запросом?
SELECT MIN(penaltyDate)
FROM Penalty
Потому что тогда ваш внутренний запрос вернет ноль, и (если вы используете нули ANSI) эта часть вернет false,
WHERE (penaltyDate = ...
Потому что сравнения с нулем всегда возвращают ноль. Поэтому вместо выбора одной строки с нулевым значением вы выбираете без строк.
Приложение:
Чтобы подтвердить, что это проблема, измените первую строку вашего внешнего запроса на
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
Это будет работать из-за того, что я описал выше.