SQL 中的聚合查询

aggregate query in SQL

我需要按如下方式汇总数据。这涉及不同日期不同等级矿石的进口。我有以下示例数据,并希望获得每个年级

日期的累积数据
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

我怀疑我遗漏了一些简单的东西

我猜你想要的是:

select a.grade, a.dat, (select sum(amount) from table1 b
                        where (a.grade=b.grade) and (a.dat >= b.dat))
from table1 a

(假设没有重复的 grade/dat 行。)

您使用的 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 函数。

我猜你想看到随着时间的推移累积:

select grade
      ,dat
      ,amount
      ,sum(amount) 
           over (partition by grade order by dat range between UNBOUNDED PRECEDING and current row) cumulative_amount
from table1;

这给出了 cumulative_amount 列中直到第 1 天的成绩总和。