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 天的成绩总和。
我需要按如下方式汇总数据。这涉及不同日期不同等级矿石的进口。我有以下示例数据,并希望获得每个年级
日期的累积数据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 天的成绩总和。