2012-03-29 43 views
1

行值我有一個查詢它提供了以下數據:添加使用查詢

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

當您使用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

使用子查詢與變量,例如 -

SELECT @rev:[email protected] + revenue AS revenue, total, period, user FROM (
    SELECT SUM(c.planned_revenue) AS revenue, u.expected_target AS total... 
    ... 
    ... 
) t1, 
    (SELECT @rev :=0) t2 
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 

檢索運行總需求鏈接到主查詢相應的用戶等,幷包括所有日期直至幷包括當期查詢。所以可能需要調整,但這就是原理