已知一个表结构如下
标签 描述 数量
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 不开机 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 不开机 900
2 短路 200
3 Lanfail 200
<orthers> <orthers> 330 然后再求百分比...
大哥,直接给代码吧,刚从SqlServer 转到 oracle,很多都不懂
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%
兄弟很厉害,但是,
不好意思,小弟实在还没入门,看不懂诶
decode 还有 rn 还有 trunc 还有 row_number()over 都是什么函数。
我使劲再看看
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