sum()over()和count()over()分析函数

时间:2022-01-30 18:11:12

创建测试表

create table test(sales_id varchar2(2),sales varchar2(10),dest varchar2(10),dept varchar2(10),revenue number);

插入测试数据

insert into test values('','smith','hangzhou','市场',1000);
insert into test values('','smith','wenzhou','市场',2000);
insert into test values('','allen','wenzhou','渠道',3000);
insert into test values('','allen','wenzhou','渠道',4000);
insert into test values('','jekch','shanghai','渠道',2500);
insert into test values('','smith','hangzhou','市场',1000);
insert into test values('','smith','wenzhou','市场',2000);
commit;

查看表记录

SQL> select * from test;
SALES_ID   SALES       DEST       DEPT     REVENUE
-------- ---------- ---------- ---------- ----------
11 smith hangzhou 市场 1000
12 smith wenzhou 市场 2000
13 allen wenzhou 渠道 3000
14 allen wenzhou 渠道 4000
15 jekch shanghai 渠道 2500
11 smith hangzhou 市场 1000
12 smith wenzhou 市场 2000
SQL> select sales_id,sales,dest,dept,revenue,sum(revenue) over() as 总销售额 from test;
SALES_ID   SALES       DEST       DEPT      REVENUE   总销售额
-------- ---------- ---------- ---------- ---------- ----------
11 smith hangzhou 市场 1000 15500
12 smith wenzhou 市场 2000 15500
13 allen wenzhou 渠道 3000 15500
14 allen wenzhou 渠道 4000 15500
15 jekch shanghai 渠道 2500 15500
11 smith hangzhou 市场 1000 15500
12 smith wenzhou 市场 2000 15500

按照sales_id order by排序计算递加的销售总额

SQL> select sales_id,sales,dest,dept,revenue,sum(revenue)over(order by sales)递加销售总额 from test;
SALES_ID    SALES      DEST       DEPT      REVENUE  递加销售总额
-------- ---------- ---------- ---------- ---------- ------------
14 allen wenzhou 渠道 4000 7000
13 allen wenzhou 渠道 3000 7000
15 jekch shanghai 渠道 2500 9500
11 smith hangzhou 市场 1000 15500
12 smith wenzhou 市场 2000 15500
12 smith wenzhou 市场 2000 15500
11 smith hangzhou 市场 1000 15500

7 rows selected
SQL> select sales_id,sales,dest,dept,revenue,sum(revenue)over(partition by sales_id) 分组销售总额 from test;
SALES_ID   SALES       DEST       DEPT     REVENUE    分组销售总额
-------- ---------- ---------- ---------- ---------- ------------
11 smith hangzhou 市场 1000 2000
11 smith hangzhou 市场 1000 2000
12 smith wenzhou 市场 2000 4000
12 smith wenzhou 市场 2000 4000
13 allen wenzhou 渠道 3000 3000
14 allen wenzhou 渠道 4000 4000
15 jekch shanghai 渠道 2500 2500

对sales_id进行分组,然后分组求sum

SQL> select sales_id,sales,dest,dept,revenue,sum(revenue)over(partition by sales order by sales_id) 分组递加销售总额 from test;
SALES_ID    SALES      DEST       DEPT     REVENUE    分组递加销售总额
-------- ---------- ---------- ---------- ---------- ----------------
13 allen wenzhou 渠道 3000 3000
14 allen wenzhou 渠道 4000 7000
15 jekch shanghai 渠道 2500 2500
11 smith hangzhou 市场 1000 2000
11 smith hangzhou 市场 1000 2000
12 smith wenzhou 市场 2000 6000
12 smith wenzhou 市场 2000 6000

对sales进行分组,然后分组内递加sum。

看下面的count()over()分析函数的使用

SQL> select sales_id,sales,count(*)over()求总计数,
count(*)over(order by sales_id)递加求计数,
count(*)over(partition by sales_id)分组求计数,
count(*)over(partition by sales_id order by sales)分组递加求计数
from test;
SALES_ID    SALES     求总计数   递加求计数   分组求计数  分组递加求计数
-------- ---------- ---------- ---------- ---------- --------------
11 smith 7 2 2 2
11 smith 7 2 2 2
12 smith 7 4 2 2
12 smith 7 4 2 2
13 allen 7 5 1 1
14 allen 7 6 1 1
15 jekch 7 7 1 1

本文转自:http://blog.itpub.net/25362835/viewspace-1057319/