关于一个比例的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,谢谢
...全文
102 16 打赏 收藏 转发到动态 举报
写回复
用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
前段时间在写一个服务端程序的时候,  需要用到mysql. 客户端连接服务端执行sql分好几种情况, { 查询SQL, 执行SQL, 执行SQL事务, 批量执行支持, 查询执行混合 } ... 其中的"批量执行"就有点让我头疼, 玩过sql的都知道, 批量执行一般以";" 终结符算一条sql语句, 以此分割. 难点就是把批量的sql语句, 分割为单条, 一个一个的执行.    估计有的易友可能想到了"分割文本, 发送文本数组" 首先"发送文本数组", 我不喜欢,  有时候显得麻烦. 其次"分割文本", 你可能会遇到这样以下这样的情况, 也就是sql字符串中出现了";", 你能怎么办? 你也很绝望对吧? 复制代码 [font=微软雅黑]INSERT INTO `User`(name) values('剑''齿;虎');  SELECT LAST_INSERT_ID();[/font] 以上问题还有, 字符串中包含单引号就需要用两个单引号表示.... 实在不想屈服于前面两种蛋疼的方式,  试着自己封装子程序解析, 忽略字符串什么的.   有时候脑子是个好东西,  可惜我好像没有似的...   感觉设计起来还挺复杂麻烦的,  我没学过什么脚本设计,  编译设计的. 于是前段时间论坛有几个帖子被顶起来了,  一个叫"无间酱"的大佬制作了好几个练手的脚本语言设计, 我灵机一动...  脚本也会遇到这样的问题,   就把源码中的解析终结符部分给抠出来了...  总算说到重点了. 刚开始还不能直接用,   改了改还算可以了. 示例 复制代码 INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');--注释A:插入语句-- SELECT * FROM User; /*注释B:查询*/ UPDATE User SET pwd='ac''c' WHERE uid=1 结果: 数组:3{ “INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');”, “--注释A:插入语句-- SELECT * FROM User;”, “/*注释B:查询*/ UPDATE User SET pwd='ac''c' WHERE uid=1” }
批量sql解析为数组, SQL终结符解析 前段时间在写一个服务端程序的时候,需要用到mysql. 客户端连接服务端执行sql分好几种情况, { 查询SQL, 执行SQL, 执行SQL事务, 批量执行支持, 查询执行混合 } ... 其中的"批量执行"就有点让我头疼, 玩过sql的都知道, 批量执行一般以";" 终结符算一条sql语句, 以此分割. 难点就是把批量的sql语句, 分割为单条, 一个一个的执行.估计有的易友可能想到了"分割文本, 发送文本数组" 首先"发送文本数组", 我不喜欢,有时候显得麻烦. 其次"分割文本", 你可能会遇到这样以下这样的情况, 也就是sql字符串中出现了";", 你能怎么办? 你也很绝望对吧? INSERT INTO `User`(name) values('剑''齿;虎');SELECT LAST_INSERT_ID(); 以上问题还有, 字符串中包含单引号就需要用两个单引号表示.... 实在不想屈服于前面两种蛋疼的方式,试着自己封装子程序解析, 忽略字符串什么的. 有时候脑子是个好东西,可惜我好像没有似的... 感觉设计起来还挺复杂麻烦的,我没学过什么脚本设计,编译设计的. 于是前段时间论坛有几个帖子被顶起来了,一个叫"无间酱"的大佬制作了好几个练手的脚本语言设计, 我灵机一动...脚本也会遇到这样的问题, 就把源码中的解析终结符部分给抠出来了...总算说到重点了. 刚开始还不能直接用, 改了改还算可以了. INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');--注释A:插入语句-- SELECT * FROM User; /*注释B:查询*/ UPDATE User SET pwd='ac''c' WHERE uid=1 结果: 数组:3{ “INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');”, “--注释A:插入语句-- SELECT * FROM User;”, “/*注释B:查询*/ UPDATE User SET pwd='ac''c' WHERE uid=1” } 感觉瞬间正规了许多, 不用去使用那些"偏方", 导致出现各种各样的杯具

17,377

社区成员

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

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