$query1 = Product::find()->andWhere(['>','price',0])->orderBy('price');
$query2 = Product::find()->andWhere(['price'=>0]);
$query1->union($query2);
$query1->all(); // или скормили дата провайдеру
Сортировка просто по количеству товаров не подходит, так как кроме этой сортировки есть еще 2 (по цене и по еще одному полю).
$products = Product::find()->where([/**/])->orderBy(['count' => SORT_DESC, 'price' => SORT_DESC, 'eshe_odno_pole' => SORT_DESC])->all();