Is there a way NOT to email if a report with no result
As suggested by Demerit you can use alterMailParams to abort the email if the report has 0 rows. It will work on simple use case but would be difficult or need to add more logic you passing any additional parameters when running cron job or through url to filter the result since the ReportTemplate.getrows api will return the results which is saved in the database but not on fly.

However you can using hook_civicrm_alterReportVar and set $this->_sendmail to FALSE when $rows are empty.

HTH

Pradeep