使用查询添加行值

时间:2012-03-29 06:59:36

标签: mysql sql postgresql

我有一个查询提供以下数据:

 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 :(得分:0)

将子查询与变量一起使用,例如 -

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

答案 1 :(得分:0)

您正在寻找的是一个总计。如果没有实际检查,您需要以下内容:

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

检索正在运行的总计的查询需要链接到适当用户等的主查询,并包括所有日期,包括当前期间。所以可能需要调整,但这是原则

答案 2 :(得分:0)

当您使用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而不是where子句中的隐式连接。