我有一个查询提供以下数据:
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
获得上述输出需要进行哪些更改?
答案 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子句中的隐式连接。