语法:ratio_to_report(exp) over([partition by column_name,...])
SQL> create table TEST
2 (
3 姓名 VARCHAR2(20),
4 科目 VARCHAR2(20),
5 成绩 NUMBER
6 )
7 /
Table created
SQL> insert into test (姓名, 科目, 成绩)
2 values ('A', '英语', 40);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('B', '英语', 100);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('C', '英语', 60);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('D', '语文', 60);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('E', '语文', 40);
1 row inserted
SQL> commit;
Commit complete
1、使用传统方法
SQL> with
2 a as (select sum(成绩) as 总成绩 from test),
3 b as (select 科目, sum(成绩) as 科目成绩 from test group by 科目)
4 select 姓名,t.科目,成绩,科目成绩,总成绩,成绩/总成绩 as 占所有成绩的百分比,成绩/科目成绩 as 占科目成绩的百分比
5 from test t,a,b
6 where t.科目=b.科目 order by 姓名
7 /
姓名 科目 成绩 科目成绩 总成绩 占所有成绩的百分比 占科目成绩的百分比
-------------------- -------------------- ---------- ---------- ---------- ------------------ ------------------
A 英语 40 200 300 0.133333333333333 0.2
B 英语 100 200 300 0.333333333333333 0.5
C 英语 60 200 300 0.2 0.3
D 语文 60 100 300 0.2 0.6
E 语文 40 100 300 0.133333333333333 0.4
2、使用ratio_to_report(exp) over([partition by column_name,...])
SQL> select 姓名,科目,成绩,
2 ratio_to_report(成绩) over() as 占所有成绩的百分比,
3 ratio_to_report(成绩) over(partition by 科目) as 占本科目成绩的百分比 from test order by 姓名;
姓名 科目 成绩 占所有成绩的百分比 占本科目成绩的百分比
-------------------- -------------------- ---------- ------------------ --------------------
A 英语 40 0.133333333333333 0.2
B 英语 100 0.333333333333333 0.5
C 英语 60 0.2 0.3
D 语文 60 0.2 0.6
E 语文 40 0.133333333333333 0.4
SQL>
SQL> create table TEST
2 (
3 姓名 VARCHAR2(20),
4 科目 VARCHAR2(20),
5 成绩 NUMBER
6 )
7 /
Table created
SQL> insert into test (姓名, 科目, 成绩)
2 values ('A', '英语', 40);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('B', '英语', 100);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('C', '英语', 60);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('D', '语文', 60);
1 row inserted
SQL> insert into test (姓名, 科目, 成绩)
2 values ('E', '语文', 40);
1 row inserted
SQL> commit;
Commit complete
1、使用传统方法
SQL> with
2 a as (select sum(成绩) as 总成绩 from test),
3 b as (select 科目, sum(成绩) as 科目成绩 from test group by 科目)
4 select 姓名,t.科目,成绩,科目成绩,总成绩,成绩/总成绩 as 占所有成绩的百分比,成绩/科目成绩 as 占科目成绩的百分比
5 from test t,a,b
6 where t.科目=b.科目 order by 姓名
7 /
姓名 科目 成绩 科目成绩 总成绩 占所有成绩的百分比 占科目成绩的百分比
-------------------- -------------------- ---------- ---------- ---------- ------------------ ------------------
A 英语 40 200 300 0.133333333333333 0.2
B 英语 100 200 300 0.333333333333333 0.5
C 英语 60 200 300 0.2 0.3
D 语文 60 100 300 0.2 0.6
E 语文 40 100 300 0.133333333333333 0.4
2、使用ratio_to_report(exp) over([partition by column_name,...])
SQL> select 姓名,科目,成绩,
2 ratio_to_report(成绩) over() as 占所有成绩的百分比,
3 ratio_to_report(成绩) over(partition by 科目) as 占本科目成绩的百分比 from test order by 姓名;
姓名 科目 成绩 占所有成绩的百分比 占本科目成绩的百分比
-------------------- -------------------- ---------- ------------------ --------------------
A 英语 40 0.133333333333333 0.2
B 英语 100 0.333333333333333 0.5
C 英语 60 0.2 0.3
D 语文 60 0.2 0.6
E 语文 40 0.133333333333333 0.4
SQL>