declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
上面的选择返回如下内容。
id SomeNumt
1 10
2 12
3 3
4 15
5 23
我如何得到以下:
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
select t1.id, t1.SomeNumt, SUM(t2.SomeNumt) as sum
from @t t1
inner join @t t2 on t1.id >= t2.id
group by t1.id, t1.SomeNumt
order by t1.id
SQL小提琴示例
输出
| ID | SOMENUMT | SUM |
-----------------------
| 1 | 10 | 10 |
| 2 | 12 | 22 |
| 3 | 3 | 25 |
| 4 | 15 | 40 |
| 5 | 23 | 63 |
编辑:这是一个通用的解决方案,可以在大多数数据库平台上工作。如果有更好的解决方案适用于你的特定平台(例如,gareth的平台),那就使用它!
SQL解决方案结合“无界前行和当前行之间的行”和“和”做的正是我想要实现的。
非常感谢!
如果这能帮到谁,这是我的案子。我想在一列中累积+1,每当发现一个maker为“Some maker”(示例)。如果不是,则不增加,但显示之前的增加结果。
这段SQL:
SUM( CASE [rmaker] WHEN 'Some Maker' THEN 1 ELSE 0 END)
OVER
(PARTITION BY UserID ORDER BY UserID,[rrank] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Cumul_CNT
让我得到这样的东西:
User 1 Rank1 MakerA 0
User 1 Rank2 MakerB 0
User 1 Rank3 Some Maker 1
User 1 Rank4 Some Maker 2
User 1 Rank5 MakerC 2
User 1 Rank6 Some Maker 3
User 2 Rank1 MakerA 0
User 2 Rank2 SomeMaker 1
上面的解释:它从0开始计数“some maker”,some maker被找到,我们做+1。对于用户1,MakerC被找到,所以我们不做+1,而是一些制造商的垂直计数被固定为2,直到下一行。
分区是按用户划分的,所以当我们改变用户时,累积计数返回零。
我在工作,我不希望这个答案有任何优点,只是说谢谢,并以身作则,以防有人处于同样的情况。我试图结合SUM和PARTITION,但惊人的语法“无界前行和当前行之间的行”完成了任务。
谢谢!
Groaker