Je pense que pour la commande par pièce, vous devriez utiliser quelque chose comme
order by case
when stock > 0 then 0
when stock < 0 then 1
end ascending,
price ascending
Je n'ai pas vérifié la syntaxe mais c'est l'idée. Vous pouvez google cas dans l'ordre par pour plus d'informations.
Quant au reste de vos exigences, j'aurais besoin de la structure du tableau pour mieux comprendre...