SQL中的聚合查询

时间:2015-01-02 13:59:17

标签: sql ms-access

我需要按如下方式进行数据汇总。这适用于沿不同日期进口各种等级的矿石。我有以下样本数据,并希望获得每个年级的累积数据

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

我怀疑我错过了一些简单的事情

3 个答案:

答案 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函数。