Предположительно, ваш вопрос вызван заданием школы или колледжа. По крайней мере, я на это надеюсь, потому что использование функции для этой цели - плохая практика. Он работает плохо из-за постоянного переключения между механизмами SQL и PL / SQL, а также потому, что он запрашивает доставку построчно, а не с помощью операции set.
Простой оператор чистого SQL работает лучше. Я решил использовать внешнее объединение, потому что вы, вероятно, хотите включить продукты, которые не были активны в прошлом году.
select p.product_id
, p.product_name
, count(d.delivery_id) as sales_this_year
from products p
left outer join deliveries d
on (p.product_id = d.product_id)
where d.dispatch_date >= add_months(sysdate, -12)
group by p.product_id, p.product_name
/
Я истолковал «в прошлом году» как обозначение последних двенадцати месяцев, поэтому я использовал функцию ADD_MONTHS (). В другой интерпретации предложение WHERE будет выглядеть так:
where d.dispatch_date between to_date('01-JAN-2010') and to_date('31-DEC-2010')
это последний календарный год; или возможно:
where d.dispatch_date >= trunc(sysdate, 'YYYY')
то есть этот календарный год.