我必须找到一种方法来解决这个问题...在这样的表中,我会看到我的列“C”在每行上增加其值,从一个常数开始,在“B”列中添加值,在同一列“C”中按先前值添加值。
此外......按用户分组。
例如:(起点Phil:350,起点Mark:100)
USER - POINT - INITIALPOINT Phil - 1000 - 1350 Phil - 150 - 1500 Phil - 200 - 1700 Mark - 300 - 400 Mark - 250 - 650
我该怎么做?
答案 0 :(得分: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)和一个更好的方法来做一个起始值(我使用一个单独的表)
答案 1 :(得分: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
。它可以是增加的主键或其他东西,只要它定义行的正确排序。
答案 2 :(得分: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;