0

我必须找到解决这个问题的方法......在这样的表中,我会看到我的列“C”在每一行上增加他的值,从一个常数开始,在“B”列中添加值并通过同一列“C”中的前一个值。

此外...按用户分组。

例如:(起点Phil:350,起点Mark:100)

用户 - 点 - 初始点
菲尔 - 1000 - 1350
菲尔 - 150 - 1500
菲尔 - 200 - 1700
马克 - 300 - 400
马克 - 250 - 650

我怎样才能做到这一点?

4

3 回答 3

2

使用窗口。表声明是 SQL Server,但如果您的 RDBMS 支持,其余部分是标准 SQL(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)和一个更好的方法来做一个起始值(我使用了一个单独的表)

于 2013-06-05T14:10:32.927 回答
1

SQL Server 2008 不支持直接使用窗口函数的累积和。您可以使用相关子查询来获得相同的效果。

因此,使用与 GBN 相同的结构:

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;
于 2013-06-05T14:28:41.503 回答
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;

您需要一些列来对行进行排序,否则“运行总和”将是有意义的,因为表中的行未排序(关系表中没有“第一行”之类的东西)。some_date_column在我的例子中就是这样。只要它定义了正确的行顺序,它就可以是一个递增的主键或其他东西。

于 2013-06-05T14:00:51.210 回答