求合格人数及不合格人数。

表结构:

SQL> desc t_mms_loan_pratc_train;
Name               Type          Nullable Default Comments
------------------ ------------- -------- ------- --------
PAPER_ID           VARCHAR2(32)                           
TLR_ID             VARCHAR2(7)   Y                        
TLR_NM             VARCHAR2(32)  Y                        
TRAIN_PAPER_ID     VARCHAR2(32)  Y                        
TRAIN_DT           VARCHAR2(10)  Y                        
TRAIN_ADDR         VARCHAR2(256) Y                        
TRAIN_CONTENT      VARCHAR2(256) Y                        
SCORE              NUMBER(16,2)  Y                        
TRAIN_EVL          VARCHAR2(256) Y                        
LAST_MODIFY_TLR_ID VARCHAR2(9)   Y                        
LAST_MODIFY_PRG_ID VARCHAR2(60)  Y                        
LAST_MODIFY_TM     VARCHAR2(19)  Y

 

前10条数据:

SQL> select tlr_id,score,train_evl from t_mms_loan_pratc_train where rownum<=10;

TLR_ID               SCORE TRAIN_EVL
------- ------------------ --------------------------------------------------------------------------------
B010224             221.00 良好
B010225             222.00 良好
B010226             223.00 良好
B010227             224.00 良好
B010228             225.00 良好
B010229             226.00 良好
B010230             227.00 良好
B010231             228.00 良好
B010232             229.00 良好
B010233             230.00 良好

 

 

在此表里面查询出合格人数以及不合格人数:

可以使用oracle里面的decode函数和sign函数。

decode()函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。

      DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。DECODE有什么用途呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。 如果用DECODE函数,那么我们就可以把这些流控制语句省略,通过SQL语句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很简洁? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。

 

decode()函数使用技巧

  ·含义解释:

  decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

  该函数的含义如下:

  IF 条件=值1 THEN

  RETURN(翻译值1)

  ELSIF 条件=值2 THEN

  RETURN(翻译值2)

  ......

  ELSIF 条件=值n THEN

  RETURN(翻译值n)

  ELSE

  RETURN(缺省值)

  END IF

  · 使用方法:

  1、比较大小

  select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值

  sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1

  例如:

  变量1=10,变量2=20

  则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。

 

 

因此可以得到如此的查询语句:

select sum(decode(sign(score-60),-1,1,0))as 不合格人数,
sum(decode(sign(score-60),1,1,0))as 合格人数
from t_mms_loan_pratc_train

 

结果:

不合格人数   合格人数
---------- ----------
        10        203

 

发现不合格人数少了。看表数据才知道,有些score数据是空,当score为空时,找不出来同时当score==60时也出不来。这样写不行。

 

 

不过要改进!

改进后:

select sum(decode(sign(score-60),-1,1))as 不合格人数,
sum(decode(sign(score-60),1,1,0,1))as 合格人数
from t_mms_loan_pratc_train

结果:

不合格人数   合格人数
---------- ----------
        10        204

呵呵。。合格人数正确罗,不过不合格人数还是不正确。

 

使用另一种方法:

case when then.

select sum(case when score>=60 then 1 end) as 合格人数,
       sum(case when (score<60 or score is null) then 1 end)as 不合格人数
from t_mms_loan_pratc_train

 

结果:

  合格人数 不合格人数
---------- ----------
       204         11

这才正确。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

psyuhen

你的鼓励是我最大的动力谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值