分类(Oracle)
Oracle中做数据累计的方法( sum over)
2009/03/02 09:24

最近做一个项目,中间的数据设计中有一些累计字段。比如多个工厂,每个工厂每天有多条生产进行生产,现在按工厂及日期进行统计生产数量,并对数量按工厂及日期进行累计。本来以为这个功能要先按工厂及日期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')。

Tags: Oracle
相关日志:
+引用(0) |
发表评论
昵称  密码  游客无需密码
网址  电邮  注册
验证码 请输入左侧图片中的字符
记住我