【问题标题】:Oracle: how to get percent of total by a query?Oracle:如何通过查询获得总数的百分比?
【发布时间】:2012-12-05 10:29:16
【问题描述】:

我有以下查询,结果出乎我的意料:

select stato, (count(1) *100) / sum(1)
from LOG_BONIFICA
group by stato;

它为所有行返回 100。应该不一样吗?

【问题讨论】:

  • 在count()和sum()中指定列名..
  • @Gik25:只需在查询中尝试select stato, count(1) ,sum(1),然后您就会知道为什么每行都得到 100。您能告诉我们您对 count 的期望吗(1) 和总和 (1)

标签: sql oracle


【解决方案1】:

count(1) 在您的情况下等于 sum(1)

试试这样的:

18:39:36 SYSTEM@dwal> ed
Wrote file S:\\tools\buffer.sql

  1  select owner,
  2         count(*) group_cnt,
  3         sum(count(*)) over() total_cnt,
  4         round(100*(count(*) / sum(count(*)) over ()),2) perc
  5    from dba_objects
  6   group by owner
  7*  order by 4 desc
18:39:57 SYSTEM@dwal> /

OWNER                           GROUP_CNT  TOTAL_CNT       PERC
------------------------------ ---------- ---------- ----------
SYS                                 31609      59064      53.52
PUBLIC                              24144      59064      40.88
XDB                                  1660      59064       2.81
SYSTEM                                597      59064       1.01
WMSYS                                 332      59064        .56
EXFSYS                                312      59064        .53
IRKAZDATA                             158      59064        .27
STRMADMIN                              92      59064        .16
DBSNMP                                 55      59064        .09
RI                                     25      59064        .04
PASS                                   16      59064        .03
POTS                                   19      59064        .03
TI                                     11      59064        .02
STRMODS                                11      59064        .02
OUTLN                                  10      59064        .02
APPQOSSYS                               5      59064        .01
ORACLE_OCM                              8      59064        .01

17 rows selected.

Elapsed: 00:00:00.16

更新:使用 ratio_to_report 甚至更简单

18:53:36 SYSTEM@dwal> ed
Wrote file S:\\tools\buffer.sql

  1  select owner,
  2         round(100*ratio_to_report(count(*)) over (), 2) perc
  3    from dba_objects
  4   group by owner
  5*  order by 2 desc
18:54:03 SYSTEM@dwal> /

OWNER                                PERC
------------------------------ ----------
SYS                                 53.52
PUBLIC                              40.88
XDB                                  2.81
SYSTEM                               1.01
WMSYS                                 .56
EXFSYS                                .53
IRKAZDATA                             .27
STRMADMIN                             .16
DBSNMP                                .09
RI                                    .04
PASS                                  .03
POTS                                  .03
TI                                    .02
STRMODS                               .02
OUTLN                                 .02
APPQOSSYS                             .01
ORACLE_OCM                            .01

17 rows selected.

Elapsed: 00:00:00.20

【讨论】:

    【解决方案2】:

    您指的是以下内容吗? 您需要单独找到总数。

    表:

    ID  NAME    AMOUNT  STATE
    1   john    1000    fl
    2   jane    5000    ga
    3   james   2000    ca
    4   tom     6000    ga
    5   tim     8000    fl
    6   jim     2000    ga
    7   kate    8000    fl
    8   jack    3000    tx
    

    结果 1:

    STATE   SUM(AMOUNT)
    ca      2000
    fl      17000
    ga      13000
    tx      3000
    

    最终查询:

    select t1.state, concat(
      round(((sum(t1.amount)/t2.total))*100,2),
    '%') as pct
    from t1, 
    (select sum(amount) as total from t1) as t2
    group by t1.state
    ;
    

    结果:

       STATE    COUNT(T1.ID)    SUM(T1.AMOUNT)  TOTAL   PCT
       ca       1               2000           35000    5.71%
       fl       3               17000          35000    48.57%
       ga       3               13000          35000    37.14%
       tx       1               3000           35000    8.57%
    

    【讨论】:

      【解决方案3】:

      使用ratio_to_report解析函数:

      SELECT STATO, 
          COUNT(1) STATO_COUNT, 
          RATIO_TO_REPORT(COUNT(1)) OVER() * 100 STATO_PERCENT
      FROM LOG_BONIFICA
      GROUP BY STATO
      

      因此您无需自己计算总行数和比率。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2019-08-12
        • 1970-01-01
        相关资源
        最近更新 更多