Для # 1, чтобы создать порядок сортировки, подобный этому (1, 5, 6, 8, 10, 0, 0, 0), вы можете создать еще один столбец, по которому можно отсортировать, и вставить специальное условие сортировки, которое вы хотите с определением этого столбца.
Например (см. SortOrder ниже):
SELECT count(*) over() Total_Record,
p.product_id, p.product_name,
ISNULL(MIN(r.price), 0) AS MinPrice,
case when ISNULL(MIN(r.price), 0) > 0 then 1 else 0 end as sortOrder
FROM @Products p
LEFT OUTER JOIN @Rates r ON
r.product_id = p.product_id
GROUP BY
p.product_id, p.product_name
ORDER BY
sortOrder desc, MinPrice asc
Если я правильно понял ваш вопрос.
Я переключил ваши 8 и 10, а также я предполагаю, что вы пытаетесь отсортировать по вычисленному полю минимальной цены по возрастанию, но с нулями в конце, а не в начале. Все ненулевые значения получают sortOrder = 1, а нулевые значения - sortOrder = 0. Это отделяет нулевые и ненулевые значения, поэтому вы можете сортировать их по своему усмотрению
Что касается # 2 - для этого вы хотите дополнительный столбец в вашем выборе, который включает в себя номер строки упорядоченных значений.
Единственный простой способ сделать это - через row_number ().
SELECT count(*) over() Total_Record,
p.product_id, p.product_name,
ISNULL(MIN(r.price), 0) AS MinPrice,
case when ISNULL(MIN(r.price), 0) > 0 then 1 else 0 end as sortOrder,
row_number() OVER(order by sortOrder desc, MinPrice asc) as rowNumber
FROM @Products p
LEFT OUTER JOIN @Rates r ON
r.product_id = p.product_id
GROUP BY
p.product_id, p.product_name
ORDER BY
sortOrder desc, MinPrice asc
Это создает row_number () на основе предложения output_by.
(Обратите внимание, что сейчас у меня нет экземпляра SQL Server для двойной проверки синтаксиса. Кроме того, я действительно хотел бы проверить, чтобы MSSQL не препятствовал объединению групп с помощью row_number (). В документах ничего не сказано, и я не очень часто использую эту функцию. Но вот она.)