最近做一个项目,中间的数据设计中有一些累计字段。比如多个工厂,每个工厂每天有多条生产进行生产,现在按工厂及日期进行统计生产数量,并对数量按工厂及日期进行累计。本来以为这个功能要先按工厂及日期Group出数据,累计要循环来统计的,结果从网上看到Oracle的Sum Over的方法,研究下来,真是很爽,很容易就解决了这个问题。
1.原表信息
SQL> select company, crtdate, line, qty from test order by company, crtdate;
|
COMPANY |
CRTDATE |
LINE |
QTY |
| ------- | ----------- | ------- |
---------- |
| SSS | 2008-01-01 | 1 |
4 |
| SSS | 2008-01-02 | 1 |
4 |
| SSS | 2008-01-03 | 1 |
4 |
| SSS | 2008-01-03 | 2 |
4 |
| TTT | 2008-01-01 | 1 |
1 |
| TTT | 2008-01-01 | 2 |
2 |
| TTT | 2008-01-02 | 1 |
3 |
| WWW | 2008-01-01 | 5 |
9 |
| WWW | 2008-02-01 | 1 |
7 |
9 rows selected
2. 如果没有累计字段,简单的Group就可以解决
SQL> select company, crtdate, sum(qty) qty from test group by company, crtdate;
|
COMPANY |
CRTDATE |
QTY |
| ------- | ----------- |
---------- |
| SSS | 2008-01-01 |
4 |
| SSS | 2008-01-02 |
4 |
| SSS | 2008-01-03 |
8 |
| TTT | 2008-01-01 |
3 |
| TTT | 2008-01-02 |
3 |
| WWW | 2008-01-01 |
9 |
| WWW | 2008-02-01 |
7 |
7 rows selected
3. 有累计字段时,需要使用sum over
select company, crtdate, qty, sum(qty) over(partition by company, to_char(crtdate, 'YYYYMM') order by company, crtdate ) total from
( select company, crtdate, sum(qty) qty from test group by company, crtdate ) T
|
COMPANY |
CRTDATE |
QTY |
TOTAL |
| ------- | ----------- |
---------- |
---------- |
| SSS | 2008-01-01 |
4 |
4 |
| SSS | 2008-01-02 |
4 |
8 |
| SSS | 2008-01-03 |
8 |
16 |
| TTT | 2008-01-01 |
3 |
3 |
| TTT | 2008-01-02 |
3 |
6 |
| WWW | 2008-01-01 |
9 |
9 |
| WWW | 2008-02-01 |
7 |
7 |
7 rows selected
这里是每月单独累计,所以在partition中添加了按月的计算字段to_char(crtdate, 'YYYYMM')。
| 昵称 密码 游客无需密码 |
| 网址 电邮 注册 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |







