Спасибо большое за ответ! Думаю его можно вполне считать за ответ на вопрос. Запрос правда переделал для mysql, просто не работает функци mydiff там так просто. И также решил эту проблему двойственности объекта (если два контракта на один объект в пределах месяца), используя DISTINCT по первичному ключу объекта в счётчике. Вот получился такой запрос:
select DATE_FORMAT(`cur_month`,'%Y.%m') as "Год, месяц",count(DISTINCT c.cadastral_number) as "Количество сдаваемых объектов", count(DISTINCT c.cadastral_number)/(SELECT count(*) FROM object)*100 as "% от общего количества объектов"
From contract c right join mes m on ( DATE_FORMAT(`cur_month`,'%Y.%m')>=DATE_FORMAT(`starting_date`,'%Y.%m') and DATE_FORMAT(`cur_month`,'%Y.%m')<=DATE_FORMAT(`expiring_date`,'%Y.%m'))
Where (DATE_FORMAT(`cur_month`,'%Y.%m')>(SELECT DATE_FORMAT(DATE_SUB(curdate(), INTERVAL 12 MONTH),'%Y.%m')) AND DATE_FORMAT(`cur_month`,'%Y.%m')<=DATE_FORMAT(curdate(), '%Y.%m'))
group by DATE_FORMAT(`cur_month`,'%Y.%m')