有表如下:
表名:table1
字段有两个:name amount
表的数据如下:
---------------
aa 10
bb 20
aa 10
bb 20
cc 30
---------------
select name, sum(amount)
from table1
group by name;
返回结果:
-------------
aa 20
bb 40
cc 30
------------
当前问题是,返回结果不仅要有有2列,还要求在加一列,这一列显示出name这个字段对应的总的汇总数量,占总数量的百分比。
如上边返回结果表明,表里的总数量是: 20+40+30=90
那么现在要求返回如下结果:
-------------
aa 20 23% (既20/90的结果)
bb 40 44% (既40/90的结果)
cc 30 33% (既30/90的结果)
------------
怎样写这个sql呢?
如果借助oracle的函数如何写? 如果写成标准sql如何写?
我知道RATIO_TO_REPORT的方法,这个解答就不必了
oracle中
PHP code:--------------------------------------------------------------------------------
SQL> select * from th_01;
NA JE
-- ----------
aa 10
bb 20
aa 10
bb 20
cc 30
SQL> select name, (round(max(xj) / max(zj), 2)) * 100 || '%'
2 from (select name,
3 je,
4 sum(je) over(partition by name order by name) xj,
5 sum(je) over() zj
6 from th_01)
7 group by name;
NA (ROUND(MAX(XJ)/MAX(ZJ),2))*100||'%'
-- -----------------------------------------
aa 22%
bb 44%
cc 33%
SQL>
PHP code:--------------------------------------------------------------------------------
SQL> with tt as (
2 select 'aa' na, 10 am from dual union all
3 select 'bb', 20 from dual union all
4 select 'aa', 10 from dual union all
5 select 'bb', 20 from dual union all
6 select 'cc', 30 from dual
7 )
8 select a.*, RATIO_TO_REPORT(su) over()
9 from (select na, sum(am) su from tt group by na) a
10 ;
NA SU RATIO_TO_REPORT(SU)OVER()
-- ---------- -------------------------
aa 20 0.222222222222222
bb 40 0.444444444444444
cc 30 0.333333333333333
SQL>