关于一个比例的SQL语句,我脑子实在转不过弯了,请帮忙

iranjn 2011-02-21 06:45:08
一个表
TEMP有三个字段,大体记录如下
A B C
1 0 0
1 0 0
2 0 0
2 0 0
2 0 0
1 0 0
1 0 0
1 0 0
1 0 0
要用一个SQL语句查出以下的结果

总条数 A字段1占百分比 A字段2占百分比

数据量可能很多,请帮助写一条效率较高的SQL,谢谢
...全文
114 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
iranjn 2011-02-22
  • 打赏
  • 举报
回复
用动态的SQL把gelyon方法处理后问题解决谢谢,结贴
金色闪光 2011-02-22
  • 打赏
  • 举报
回复
学习了,count的时候就是null跳过,其余计数,sum的时候就是所有数字计数是吧。

还有,sum的话,最好是这样sum(nvl(a,0)),不然如果你的a字段有一个为空的话,整个sum的结果都是null了
luoyoumou 2011-02-22
  • 打赏
  • 举报
回复
-- 占用百分比?是什么东东的占用百分比?什么与什么相比 ?
「已注销」 2011-02-22
  • 打赏
  • 举报
回复
分析函数比较爽
gelyon 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iranjn 的回复:]
存储过程中用了 distinct a, count(a)over(partition by a)/count(*)over()报错
是不是存储过程不支持呀
[/Quote]
存储过程必须用变量去接受结果,或者返回结果
iranjn 2011-02-22
  • 打赏
  • 举报
回复
存储过程中用了 distinct a, count(a)over(partition by a)/count(*)over()报错
是不是存储过程不支持呀
njlywy 2011-02-21
  • 打赏
  • 举报
回复

select count(decode(A,1,1,null))/count(*) 1占的百分比,
count(decode(A,2,1,null))/count(*) 2占的百分比
from tablename;

桑若 2011-02-21
  • 打赏
  • 举报
回复
高手就是多啊。顺便学习了。
碧水幽幽泉 2011-02-21
  • 打赏
  • 举报
回复

SQL> select * from tmp;

A B C
---------- ---------- ----------
1 0 0
1 0 0
2 0 0
2 0 0
2 0 0
1 0 0
1 0 0
1 0 0
1 0 0

9 rows selected

SQL> select distinct a, count(a)over(partition by a)/count(*)over() from tmp;

A COUNT(A)OVER(PARTITIONBYA)/COU
---------- ------------------------------
1 0.666666666666667
2 0.333333333333333
碧水幽幽泉 2011-02-21
  • 打赏
  • 举报
回复

SQL> with tmp as
2 (
3 select 1 A, 0 B,0 C from dual
4 union all
5 select 1 A, 0 B,0 C from dual
6 union all
7 select 2 A, 0 B,0 C from dual
8 union all
9 select 2 A, 0 B,0 C from dual
10 union all
11 select 2 A, 0 B,0 C from dual
12 union all
13 select 1 A, 0 B,0 C from dual
14 union all
15 select 1 A, 0 B,0 C from dual
16 union all
17 select 1 A, 0 B,0 C from dual
18 union all
19 select 1 A, 0 B,0 C from dual
20 )
21 select count(decode(A,1,1,null))/count(*) "1占的百分比",
22 count(decode(A,2,1,null))/count(*) "2占的百分比"
23 from tmp;

1占的百分比 2占的百分比
----------- -----------
0.666666666 0.333333333
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iranjn 的回复:]
补充一下,这个1或者2是活的,但是只可能有2个
[/Quote]
什么意思?
是哪两个就写哪两个嘛

/*
decode函数的用法
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
【功能】根据条件返回相应值
【参数】c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null
注:值1……n 不能为条件表达式,这种情况只能用case when then end解决
*/
/*用你的来说明的话就是
decode(A,1,1,null) 如果A的值是1 那就用1 其他的用null
*/
select count(decode(A,1,1,null))/count(*) 1占的百分比,
count(decode(A,2,1,null))/count(*) 2占的百分比
from tbname

gelyon 2011-02-21
  • 打赏
  • 举报
回复
select distinct a, count(a)over(partition by a)/count(*)over() from temp
iranjn 2011-02-21
  • 打赏
  • 举报
回复
补充一下,这个1或者2是活的,但是只可能有2个
QKForex 2011-02-21
  • 打赏
  • 举报
回复
可以试一试,前提A字段只有1,2两种取值。

select sum(decode(A,1,1,0))/sum(decode(A,1,1,2,1,0)),sum(decode(A,2,1,0))/sum(decode(A,1,1,2,1,0)) from temp

17,382

社区成员

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

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