Добавление значений строк с использованием запроса - PullRequest
1 голос
/ 29 марта 2012

У меня есть один запрос, который предоставляет следующие данные:

 revenue      total     period       User
 1111          150      07/2011      User1
 2513          120      09/2011      User1
 500           170      11/2011      User1

Мой запрос:

SELECT sum(c.planned_revenue)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 c.user_id = u.id and u.id = 10
      and p.name=to_char(c.create_date,'mm/yyyy') and p.fiscalyear_id = f.id and f.id = GROUP BY p.name,u.expected_target,u.name
ORDER BY p.name

Я хочу получить следующие значения (коммутативное сложение):

revenue      total     period       User
1111          150      07/2011      User1
3624          120      09/2011      User1
4124          170      11/2011      User1

Какое изменение нужно для получения вышеуказанного вывода?

Ответы [ 3 ]

0 голосов
/ 29 марта 2012

То, что вы ищете, является промежуточной суммой.Без фактической проверки вам нужно что-то вроде следующего:

select (select sum(cl.planned_revenue) from crm_lead where cl.user_id = c.user_id and cl.create_date <= 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 c.user_id = u.id and u.id = 10  
and p.name = to_char(c.create_date, 'mm/yyyy') and p.fiscalyear_id = f.id  
group by p.name, u.expected_target, u.name  
order by p.name

Запрос на получение промежуточного итога должен содержать ссылку на основной запрос для соответствующего пользователя и т. Д. И включать все даты вплоть до текущегопериод.Так что может потребоваться настройка, но это принцип

0 голосов
/ 29 марта 2012

Поскольку вы отметили свой вопрос в 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.

0 голосов
/ 29 марта 2012

Использовать подзапрос с переменной, например -

SELECT @rev:=@rev + revenue AS revenue, total, period, user FROM (
  SELECT SUM(c.planned_revenue) AS revenue, u.expected_target AS total...
  ...
  ...
  ) t1,
  (SELECT @rev :=0) t2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...