SELECT * FROM table
Вы не выполняете агрегацию.
WHERE (:city_id is null OR city_id =:city_id )
AND (:district_id is null OR district_id =:district_id )
AND (:ward_id is null OR ward_id =:ward_id )
Вы также фильтруете данные на основе этих трех столбцов.
Итак, ответ - удалить группу полностью. Если вы хотите контролировать порядок вывода, используйте вместо этого ORDER BY.
После редактирования вы включили сумму (люди).
Попробуйте следующее - обратите внимание, что я не тестировал.
SELECT SELECT city_id, district_id, ward_id, sum(people) as sum_people
FROM (SELECT city_id, district_id, case :ward_id is null then '' else ward_id end ward_id, people
FROM table
WHERE (:city_id is null OR city_id =:city_id )
AND (:district_id is null OR district_id =:district_id )
AND (:ward_id is null OR ward_id =:ward_id )
) tmp
GROUP BY city_id, district_id, ward_id END
По сути, когда вы используете null для фильтрации ward_id, он заменит результаты на "", чтобы группа по суммировала все ward_id.