Penso che per l'ordine per parte dovresti usare qualcosa come
order by case
when stock > 0 then 0
when stock < 0 then 1
end ascending,
price ascending
Non ho controllato la sintassi ma questa è l'idea. Puoi google case in ordine per maggiori informazioni.
Per quanto riguarda il resto di voi requisiti avrei bisogno della struttura della tabella per capire meglio...