Divide et Impera:
with dept_sales as(
select month(ondate) as month, year(ondate) as year, category, count(*) as N -- measure sales for each month and category
from purchase join items using itemid
group by year(ondate), month(ondate), category)
select top 1 * --pick the highest
from dept_sales
where year = year(current_timestamp) -- I imagine you need data only for current year
order by N desc --order by N asc if you want the least selling category
Если вы не группируете по годам, вы получите январь всех лет в одной и той же записи «январь», поэтому я добавил фильтр для текущего года.
Я использовал CTE для ясности кода, чтобы разделить фазы вычислений, вы можете вкладывать их, если хотите.