2013-06-05 39 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(在发布此消息后可能添加了评论)。 –