Ну, самый простой ответ: вы хотите левое соединение, чтобы вы могли получить все записи в службе + любые записи в подписке, которые совпадают.
SELECT DISTINCT s.service_id
FROM service s
JOIN plan p on s.service_id=p.service_id
left join subscribe su on p.plan_id=su.plan_id
WHERE
(s.status='Published' AND s.is_active=1)
GROUP BY su.plan_id
ORDER BY COUNT(isnull(su.subscribe_id,0)) DESC
также, вы, вероятно, хотите переместить счет в секцию выбора. как это:
select * from
SELECT s.service_id, COUNT(isnull(su.subscribe_id,0)) as [cnt]
FROM service s
JOIN plan p on s.service_id=p.service_id
left join subscribe su on p.plan_id=su.plan_id
WHERE
(s.status='Published' AND s.is_active=1)
GROUP BY su.plan_id ) A
ORDER BY [cnt] DESC
Я использовал соглашение SQL-сервера для псевдонимов столбцов. Если вы используете другую СУБД, просто измените ее соответствующим образом. Если у вас есть случаи, когда у сервиса нет плана, вы должны также изменить его на левый.