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