数据查询,难

happyxiaowuge 2010-05-25 03:34:32
已知一个表结构如下
标签 描述 数量
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查询语句
...全文
148 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
codearts 2010-05-25
  • 打赏
  • 举报
回复
一层一层地写出来,可能会好懂一些:

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
happyxiaowuge 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lihui_shine 的回复:]
引用 4 楼 happyxiaowuge 的回复:
兄弟很厉害,但是,
不好意思,小弟实在还没入门,看不懂诶
decode 还有 rn 还有 trunc 还有 row_number()over 都是什么函数。
我使劲再看看

这个,LZ可以baidu或者google下,网上很多
[/Quote]
能不能再给个简单些的语句,上面那个头大了都没看懂。
happyxiaowuge 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lihui_shine 的回复:]
引用 4 楼 happyxiaowuge 的回复:
兄弟很厉害,但是,
不好意思,小弟实在还没入门,看不懂诶
decode 还有 rn 还有 trunc 还有 row_number()over 都是什么函数。
我使劲再看看

这个,LZ可以baidu或者google下,网上很多
[/Quote]


谢啦 正在看
浪尖赏花 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happyxiaowuge 的回复:]
兄弟很厉害,但是,
不好意思,小弟实在还没入门,看不懂诶
decode 还有 rn 还有 trunc 还有 row_number()over 都是什么函数。
我使劲再看看
[/Quote]
这个,LZ可以baidu或者google下,网上很多
happyxiaowuge 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lihui_shine 的回复:]
SQL code
select decode(rn, 1, ''||标签, 2, ''||标签,3,''||标签, 'OTHERS') 标签,
decode(rn, 1, 描述, 2, 描述,3,描述, 'OTHERS') 描述,
sum(数量) 数量,
trunc(100*sum(数量)/(select sum(数量) from tab),2)|……
[/Quote]

兄弟很厉害,但是,
不好意思,小弟实在还没入门,看不懂诶
decode 还有 rn 还有 trunc 还有 row_number()over 都是什么函数。
我使劲再看看
浪尖赏花 2010-05-25
  • 打赏
  • 举报
回复
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%
happyxiaowuge 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 happyxiaowuge 的回复:]
已知一个表结构如下
标签 描述 数量
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
<or……
[/Quote]

大哥,直接给代码吧,刚从SqlServer 转到 oracle,很多都不懂
iqlife 2010-05-25
  • 打赏
  • 举报
回复
给个建议,先分组得到
1 不开机 900
2 短路 200
3 Lanfail 200
<orthers> <orthers> 330

然后再求百分比...

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧