select weather_type, round(avg(delivery_time), 2) as average_delivery_time, count(*) as delivery_count from ( select staff_id, sum(is_complaint) / count(*) as complaint_ratio from delivery_records as dr where exists( select 1 from delivery_staff as ds where ds.staff_id=dr.staff_id and ds.average_speed > 20 ) group by staff_id having complaint_ratio < 0.5 ) as tmp inner join delivery_records as dr on dr.staff_id = tmp.staff_id inner join weather_conditions as w on dr.weather_id = w.weather_id group by w.weather_id