- COUNT函数的语法描述
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions032.htm#SQLRF00624
COUNT({ * | [ DISTINCT | ALL ] expr })
[ OVER (analytic_clause) ]
- 有关分析函数的扩展可以参考Oracle的官方文档中的“Analytic Functions”描述:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm#SQLRF06174
- 通过实验看一下普通COUNT函数和分析函数COUNT的使用方法
-- 创建测试表T,并初始化9条数据
create table t (group_id number(10), name varchar2(10), salary int);
insert into t values (1,'Tom',1200);
insert into t values (2,'Kary',2400);
insert into t values (2,'Joe',800);
insert into t values (3,'Andy',100);
insert into t values (3,'Ellen',200);
insert into t values (3,'Erick',300);
insert into t values (3,'Hou',400);
insert into t values (3,'Mary',500);
insert into t values (3,'Secooler',600);
commit;
-- T表全貌
-- 共三组数据,group_id分别是1、2和3。第1组有一个人,第2组有两个人,第3组有六个人。最后一列是每个人的薪水值
select * from t order by group_id,name;
GROUP_ID NAME SALARY
---------- ---------- ----------
1 Tom 1200
2 Joe 800
2 Kary 2400
3 Andy 100
3 Ellen 200
3 Erick 300
3 Hou 400
3 Mary 500
3 Secooler 600
9 rows selected.
-- 普通COUNT函数使用方法,地球人都知道。不过要注意,要结合group by分组使用。
select group_id, count(*) from t group by group_id;
GROUP_ID COUNT(*)
---------- ----------
1 1
2 2
3 6
-- 分析函数COUNT的混合使用方法
-- COUNT1得到所有参与计算的行的数量(非空)
-- COUNT2得到比自己薪水少的人数(包括自己在内)
-- COUNT3得到比自己薪水少200元多300元的人数(包括自己在内)
col name for a10
select group_id, name, salary, count(*) over () as count1, count(*) over (order by salary) as count2,count(*) over (order by salary range between 200 preceding and 300 following) as count3 from t order by group_id, name;
GROUP_ID NAME SALARY COUNT1 COUNT2 COUNT3
---------- ---------- ---------- ---------- ---------- ----------
1 Tom 1200 9 8 1
2 Joe 800 9 7 2
2 Kary 2400 9 9 1
3 Andy 100 9 1 4
3 Ellen 200 9 2 5
3 Erick 300 9 3 6
3 Hou 400 9 4 5
3 Mary 500 9 5 5
3 Secooler 600 9 6 4
9 rows selected.
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions032.htm#SQLRF00624
COUNT({ * | [ DISTINCT | ALL ] expr })
[ OVER (analytic_clause) ]
- 有关分析函数的扩展可以参考Oracle的官方文档中的“Analytic Functions”描述:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm#SQLRF06174
- 通过实验看一下普通COUNT函数和分析函数COUNT的使用方法
-- 创建测试表T,并初始化9条数据
create table t (group_id number(10), name varchar2(10), salary int);
insert into t values (1,'Tom',1200);
insert into t values (2,'Kary',2400);
insert into t values (2,'Joe',800);
insert into t values (3,'Andy',100);
insert into t values (3,'Ellen',200);
insert into t values (3,'Erick',300);
insert into t values (3,'Hou',400);
insert into t values (3,'Mary',500);
insert into t values (3,'Secooler',600);
commit;
-- T表全貌
-- 共三组数据,group_id分别是1、2和3。第1组有一个人,第2组有两个人,第3组有六个人。最后一列是每个人的薪水值
select * from t order by group_id,name;
GROUP_ID NAME SALARY
---------- ---------- ----------
1 Tom 1200
2 Joe 800
2 Kary 2400
3 Andy 100
3 Ellen 200
3 Erick 300
3 Hou 400
3 Mary 500
3 Secooler 600
9 rows selected.
-- 普通COUNT函数使用方法,地球人都知道。不过要注意,要结合group by分组使用。
select group_id, count(*) from t group by group_id;
GROUP_ID COUNT(*)
---------- ----------
1 1
2 2
3 6
-- 分析函数COUNT的混合使用方法
-- COUNT1得到所有参与计算的行的数量(非空)
-- COUNT2得到比自己薪水少的人数(包括自己在内)
-- COUNT3得到比自己薪水少200元多300元的人数(包括自己在内)
col name for a10
select group_id, name, salary, count(*) over () as count1, count(*) over (order by salary) as count2,count(*) over (order by salary range between 200 preceding and 300 following) as count3 from t order by group_id, name;
GROUP_ID NAME SALARY COUNT1 COUNT2 COUNT3
---------- ---------- ---------- ---------- ---------- ----------
1 Tom 1200 9 8 1
2 Joe 800 9 7 2
2 Kary 2400 9 9 1
3 Andy 100 9 1 4
3 Ellen 200 9 2 5
3 Erick 300 9 3 6
3 Hou 400 9 4 5
3 Mary 500 9 5 5
3 Secooler 600 9 6 4
9 rows selected.
0 件のコメント:
コメントを投稿