2013-06-05 38 views
0

我必須找到解決此問題的方法...在這樣的表格中,我會看到我的列「C」在每行上增加了他的值,從costant,在列「B」中增加值,並在同一列「C」中按前一值添加值。選擇sql語句中的前一行增加值列表

此外...由用戶分組。

例如:(起點菲爾:350,起點馬克:100)

 
USER - POINT - INITIALPOINT 
Phil - 1000 - 1350 
Phil - 150 - 1500 
Phil - 200 - 1700 
Mark - 300 - 400 
Mark - 250 - 650 

我怎樣才能做到這一點?

+1

? –

+0

也發佈表結構 – Stephan

+1

您需要一些表格的順序:請問它是什麼? – gbn

回答

1

SQL Server 2008不支持直接使用窗口函數的累計和。您可以使用相關的子查詢來獲得相同的效果。

因此,使用相同的結構,GBN:什麼是您使用RDBMS盧卡

DECLARE @t TABLE (ID int IDENTITY(1,1), UserName varchar(100), Point int); 

INSERT @t (UserName, Point) 
VALUES 
('Phil', 1000), 
('Phil', 150), 
('Phil', 200), 
('Mark', 300), 
('Mark', 250); 

DECLARE @n TABLE (UserName varchar(100), StartPoint int); 
INSERT @n (UserName, StartPoint) 
VALUES 
('Phil', 350), 
('Mark', 100); 

SELECT 
    T.ID, T.UserName, T.Point, 
    (N.StartPoint + 
    (select SUM(Point) from @t t2 where t2.UserName = t.userName and t2.ID <= t.id) 
    ) 
FROM 
    @n N 
    JOIN 
    @t T ON N.UserName = T.UserName 
ORDER BY 
    T.ID; 
+0

謝謝,它的作品! –

1

你沒有指定你的DBMS,所以這是ANSI SQL:

select "user", 
     point, 
     case 
     when "user" = 'Phil' then 350 
     else 100 
     end + sum(point) over (partition by "user" order by some_date_column) as sum 
from the_table 
where "user" in ('Mark', 'Phil') 
order by "user", some_date_column; 

你需要一些列的行排序,否則「運行總和」將作爲meaningliss在錶行沒有排序(關係表中沒有「第一行」)。這就是我的例子中的some_date_column。它可以是一個增加的主鍵或其他東西,只要它定義了行的正確排序即可。

2

使用窗口。表聲明是SQL Server,但其餘的是標準的SQL,如果你的RDBMS支持它(SQL Server 2012中,PostgreSQL的9.1等)

DECLARE @t TABLE (ID int IDENTITY(1,1), UserName varchar(100), Point int); 

INSERT @t (UserName, Point) 
VALUES 
('Phil', 1000), 
('Phil', 150), 
('Phil', 200), 
('Mark', 300), 
('Mark', 250); 

DECLARE @n TABLE (UserName varchar(100), StartPoint int); 
INSERT @n (UserName, StartPoint) 
VALUES 
('Phil', 350), 
('Mark', 100); 

SELECT 
    T.ID, T.UserName, T.Point, 
    N.StartPoint + SUM(Point) OVER(PARTITION BY T.UserName ORDER BY T.ID ROWS UNBOUNDED PRECEDING) 
FROM 
    @n N 
    JOIN 
    @t T ON N.UserName = T.UserName 
ORDER BY 
    T.ID; 

要做到這一點,你需要一個訂單表(我用的ID)和一個更好的方式做一個初始值(我使用了一個單獨的表格)

+0

已在Postgres 8.4中引入了窗口函數,而不是9.1(部分在SQL Server 2005中) –

+1

+1。 。 。該代碼是非常有用的,即使答案不適用於SQL Server 2008(在發佈此消息後可能添加了評論)。 –