我需要按如下方式进行数据汇总。这适用于沿不同日期进口各种等级的矿石。我有以下样本数据,并希望获得每个年级的累积数据
Grade Dat Amount
----------------
A 12/1/2014 100
A 12/4/2014 40
A 12/30/2014 25
A 1/6/2015 100
B 12/24/2014 20
B 12/28/2014 1
B 1/1/2015 30
B 1/2/2015 50
C 12/12/2014 20
C 12/31/2014 15
我希望得到以下内容
Grade Dat Amount
----------------
A 12/1/2014 100
A 12/4/2014 140
A 12/30/2014 165
A 1/6/2015 265
B 12/24/2014 20
B 12/28/2014 21
B 1/1/2015 51
B 1/2/2015 101
C 12/12/2014 20
C 12/31/2014 35
我试过这个
select a.grade, a.dat,sum(a.amount)
from table1 a, table1 b
where (a.grade=b.grade) and (a.dat>=b.dat)
group by a.grade, a.dat
这会弄乱 - 它会在每个等级中显示第一行,但是然后将第二行加倍,将第三行加倍,而不是进行累积聚合。
我明白了
project dat Expr1002
A 12/1/2014 100
A 12/4/2014 80
A 12/30/2014 75
A 1/6/2015 400
B 12/24/2014 20
B 12/28/2014 2
B 1/1/2015 90
B 1/8/2015 200
C 12/12/2014 20
C 12/31/2014 30
我怀疑我错过了一些简单的事情
答案 0 :(得分:2)
我想以下是你想要的:
select a.grade, a.dat, (select sum(amount) from table1 b
where (a.grade=b.grade) and (a.dat >= b.dat))
from table1 a
(假设没有重复的等级/数据行。)
答案 1 :(得分:1)
我猜你想看到累积的时间因此:
select grade
,dat
,amount
,sum(amount)
over (partition by grade order by dat range between UNBOUNDED PRECEDING and current row) cumulative_amount
from table1;
这为我提供了累计数字列中行数之前的等级总和。
答案 2 :(得分:0)
您使用的是哪个版本的SQL?如果您使用的是SQL Server 2012或更高版本,则可以使用SUM OVER功能。你需要像
这样的东西SELECT Grade,
Date,
SUM(Amount) OVER (PARTITION BY Grade ORDER BY Date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CumulativeSum
FROM YourTable
否则,请尝试使用CROSS APPLY函数。