Это должно быть легко, если ваша СУБД поддерживает Window Functions
SELECT ProductID,
Name,
TheYear,
OrderQty,
OrderAmount
FROM
(
SELECT DP.ProductID
,DP.Name
,Year(FS.OrderDate) as TheYear
,FS.OrderQty
,FS.OrderAmount,
,ROW_NUMBER() OVER() (PARTITION BY Year(FS.OrderDate)
ORDER BY FS.OrderQty DESC) rn
FROM dbo.DimProduct AS DP
LEFT JOIN dbo.FactSales as FS
on FS.ProductID = DP.ProductID
) s
WHERE rn <= 10
ORDER BY TheYear
Текущий запрос даст вам 10
продукты для каждого TheYear
на основе FS.OrderQty
, так как вы не имеете упомянутые критерии о том, как будут сортироваться записи .
ROW_NUMBER()
(функция РАНЖИРОВАНИЕ) будет генерировать последовательность числа для каждой группы, в данном случае Year(FS.OrderDate)
, что сортируется на основании FS.OrderQty
. Затем записи будут отфильтрованы на основе значения сгенерированной последовательности.
Однако, если ROW_NUMBER()
не будет генерировать TIE
на записи одного и того же FS.OrderQty
. Если вы хотите, чтобы с ним обращались, используйте DENSE_RANK()
вместо ROW_NUMBER()
.
Топ 10 - На основании каких критериев? – sgeddes
См. Предыдущие усилия для аналогичной задачи http://stackoverflow.com/questions/176964/select-top-10-records-for-each-category – xQbert
По количеству проданной продукции – Etienne