Используйте row_number()
с двумя уровнями агрегации:
select shopgroup, sum(cnt) as total_count,
max(case when seqnum = 1 then city end) as city_with_max,
max(case when seqnum = 1 then cnt end) as cnt_at_max
from (select substr(shopabb, 1, 4) as shopgroup, city, count(*) as cnt,
row_number() over (partition by substr(shopabb, 1, 4) order by count(*) desc) as seqnum
from table
where shopabb like'h%'
group by substr(shopabb, 1, 4), city
) t
group by shopgroup
order by sum(cnt) DESC;
Здесь - скрипт db <>, иллюстрирующий, что синтаксис работает.
EDIT:
Вы можете сделать это без оконных функций, но это намного более громоздко:
select substr(shopabb, 1, 4) as shopgroup, city, count(*) as cnt
from table t
where shopabb like'h%'
group by substr(shoppabb, 1, 4), city
having count(*) = (select count(*)
from table t2
where substr(t2.shopabb, 1, 4) = substr(t.shopabb, 1, 4)
group by city
order by count(*) desc
limit 1
);
Обратите внимание, что это вернет дубликаты, если два города совпадают по макс. Также потребуется немного больше работы, чтобы получить общую сумму.