1. 程式人生 > >group by後的彙總結果,如何去和總和做百分比

group by後的彙總結果,如何去和總和做百分比

有表如下:
表名: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> 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> 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> 

===========================

提問的智慧Oracle版
0。嘗試在google,論壇,metalink,online document裡搜尋。
1。寫清楚你的執行log,報錯資訊,寫清楚DB version , OS 
2。Instance 方面的問題,請貼出alertlog
3。network的問題,貼出server的listener.ora , sqlnet.ora 並執行lsnrctl service, 貼出client的tnsnames.ora , sqlnet.ora ,並執行tnsping 
4。DB總體效能問題,請上傳peak time的AWR report和ASSH report。同時附上CPU/MEM配置,以及CPU IDLE/free menory的情況
5。SQL效能問題,列出當前SQL,以及PLAN。同時應提供表結構,index情況,Table的record數。CBO/RBO,table是否analyze等資訊。
6。確保你的問題是Oracle相關。

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.na,a.s,a.s/b.t From
  9  (Select na,Sum(am) s From tt Group By na) a,(Select Sum(am) t From tt) b
10  /

NA          S    A.S/B.T
-- ---------- ----------
aa         20 0.22222222
bb         40 0.44444444
cc         30 0.33333333

SQL>