已知一个表结构如下
标签   描述            数量
1     不开机            900
2     短路              200
3      LanFail          200
4     USB fail          150
5     其他              100
6     不关机            50
7     network 检测不到  30然后要得到数据如下表标签      描述      数量   率(%)
1         不开机    900    30.45
2         短路      200    20.11
3         Lanfail   200    10.22
<orthers> <orthers> 330    39.11只显示最多的前三的具体数据,然后后面还有他在所有数量总和中占得比例
然后第三项后面的数据都用一行数据记录,标签和描述都为"<orthers>",数量为后面记录数量相加的总数量,以及百分比
举例中的百分比 可能不对,我随便写的 该怎么写oracle查询语句

解决方案 »

  1.   

    给个建议,先分组得到
    1 不开机 900 
    2 短路 200 
    3 Lanfail 200 
    <orthers> <orthers> 330 然后再求百分比...
      

  2.   


    大哥,直接给代码吧,刚从SqlServer 转到 oracle,很多都不懂
      

  3.   

    select decode(rn, 1, ''||标签, 2, ''||标签,3,''||标签, 'OTHERS') 标签,
           decode(rn, 1, 描述, 2, 描述,3,描述, 'OTHERS') 描述,
           sum(数量) 数量,
           trunc(100*sum(数量)/(select sum(数量) from tab),2)||'%' 率
      from (select 标签,描述,数量,row_number()over(order by 数量 desc) rn
              from tab)
     group by decode(rn, 1, 描述, 2, 描述,3,描述, 'OTHERS'),decode(rn, 1, ''||标签, 2, ''||标签,3,''||标签, 'OTHERS')
     order by max(rn)1 1 不开机 900 55.21%
    2 2 短路 200 12.26%
    3 3 LanFail 200 12.26%
    4 OTHERS OTHERS 330 20.24%
      

  4.   


    兄弟很厉害,但是,
    不好意思,小弟实在还没入门,看不懂诶
    decode  还有  rn  还有 trunc 还有  row_number()over 都是什么函数。
    我使劲再看看
      

  5.   

    这个,LZ可以baidu或者google下,网上很多
      

  6.   

    一层一层地写出来,可能会好懂一些:SQL> with tmp as(
      2       select 1 id, '不开机' as x, 900 n from dual union all
      3       select 2 id, '短路' x,  200 n from dual union all
      4       select 3 id, 'LanFail' x,  200 n from dual union all
      5       select 4 id, 'USB' x,  150 n from dual union all
      6       select 5 id, '其他' x,  100 n from dual union all
      7       select 6 id, '不开机' x,  50 n from dual union all
      8       select 7 id, 'network' x,  30 n from dual
      9  )
     10  select x,
     11         sum(n) n,
     12         RATIO_TO_REPORT(sum(n)) over() perct
     13    from (
     14          select case when rn > 3 then 'others'
     15                      else x
     16                  end x,
     17                 n
     18            from (
     19                  select x,
     20                         n,
     21                         row_number() over(order by n desc) rn
     22                    from tmp
     23                 ) tmp
     24         ) tmp
     25    group by x
     26    order by 2 desc
     27  /
     
    X                  N      PERCT
    --------- ---------- ----------
    不开机           900 0.55214723
    others           330 0.20245398
    短路             200 0.12269938
    LanFail          200 0.12269938