With base as (
select a.*,b.city,c.loan_type_name, d.loan_type_id from
loan_applications a
left join customers b
on a.customer_id = b.customer_id
left join loan_application_types d
on a.application_id = d.application_id
left join loan_types c
on d.loan_type_id = c.loan_type_id
),
base1 as (
select city
,sum(loan_amount) as total_loan_amount
,count(distinct customer_id) as total_customers
from base
group by city
),
base2 as (
select city,loan_type_name,loan_type_id,count(*) as nums from base
group by city,loan_type_name,loan_type_id
),
base3 as (
select city,row_number() over(partition by city order by nums DESC,loan_type_id) ranking, loan_type_id, loan_type_name from base2
)
select a.city, round(a.total_loan_amount,2) as total_loan_amount, round(a.total_loan_amount/a.total_customers,2) as average_loan_amount, a.total_customers,
b.loan_type_name as most_applied_loan_type
from base1 a left join base3 b
on a.city = b.city and b.ranking = 1