Поскольку вы отметили свой вопрос в PostgreSQL, промежуточный итог может быть легко достигнут с помощью оконной функции.
Из вашего вопроса мне не ясно, является ли промежуточная сумма на пользователя или за период, но следующее может дать вам отправную точку:
SELECT sum(c.planned_revenue) over (partition by u.name order by c.create_date) as revenue,
u.expected_target as total,
p.name as period,
u.name as user
FROM crm_lead c, res_users u, account_period p, account_fiscalyear f
WHERE ...
ORDER BY p.name
Часть, отвечающая за создание промежуточного итога, - это предложение over(...)
. Предоставляя ORDER BY
в нем, вы изменяете функцию агрегирования с "общего" агрегирования на "текущее" агрегирование.
Я не уверен, что полностью понял, каким должен быть «уровень группировки» для агрегата. Я предполагаю, что вы хотите получить промежуточный итог на пользователя, и это то, что делает partition by u.name
. Если вы хотите получить промежуточный итог для другой «группы», просто измените определение там.
Обратите внимание, что GROUP BY больше не требуется, когда вы используете оконную функцию.
Дополнительную информацию о функциях управления окнами можно найти в руководстве:
http://www.postgresql.org/docs/current/static/tutorial-window.html
Кстати: я бы рекомендовал использовать явные JOIN
s вместо неявного объединения в предложении where.