Jak przeanalizujesz swój warunek
termdate <= curdate() AND (termdate IS NULL OR termdate > CURDATE())
To właściwie możesz zapisać jako
Termdate is null
Ponieważ konikcja warunku
termdate <= curdate() AND termdate > CURDATE()
Nigdy nie będzie prawdziwa, czyli w termdate masz nulla, a jak sprawdzisz dokumentację datediff to dowiesz się że że jeżeli wstawisz nulla jako argument to dostaniesz nulla jako wynik.
Średnia z null to null, dlatego masz w wyniku nulla
UPDATE:
Zrobiłem błąd logiczny
Warunek
termdate <= curdate()
Sprawia, że wyklucza rekordy z nullem w termdate, czyli alternatywa z is null nie ma sensu, bo zostaje koniunkcja
termdate <= curdate() AND termdate > CURDATE()
Która nie przyjmie nigdy prawdy w wyniku więc wynik będzie pusty => AVG da nulla