Мисля, че за поръчка по част трябва да използвате нещо като
order by case
when stock > 0 then 0
when stock < 0 then 1
end ascending,
price ascending
Не съм проверявал синтаксиса, но това е идеята. Можете да потърсите в Google калъф за повече информация.
Що се отнася до останалите изисквания, ще ми трябва структурата на таблицата, за да разбера по-добре...