ITPub博客

首页 > Linux操作系统 > Linux操作系统 > decode函数和substr函数习题

decode函数和substr函数习题

原创 Linux操作系统 作者:wanghaojq 时间:2008-08-12 15:18:08 0 删除 编辑

此题也是itpub上出的题,总结一下。

第三题
-----------------------------------------------------------------------
Create table Employee
(
       empID number,
       empName varchar2(20),
       SB varchar2(10),
       XB varchar2(10),
       eDate date
);

 

insert into Employee values(1,'大傻', '迟到','早退',date'2005-10-17');
insert into Employee values(2,'二傻','按时','早退',Date'2005-10-17');
insert into Employee values(4,'大傻','按时','早退',Date'2005-10-16');
insert into Employee values(5,'二傻','按时','按时',Date'2005-10-17');


查询后的结果:

用户名  月份  上班迟到次数  下班早退次数
大傻     10     1            2
二傻     10     0            1


解题思路方法:
            1、首先还是想到利用decode函数来将“迟到”和“早退”累加起来。
            2、然后就是日期的截取了,我当时是想了好久,想到利用substr函数来截取日期中的月份,但是自己想的方法有点笨,我用了to_date函数还转换一下,这是麻烦的,也是错误的。
            3、其实直接用月份的字段,还有利用substr函数截取就可以了。
            4、这时我查到的时候是倒序的,我想将“大傻”放在上面,这时group by函数后不仅加empname,还要将substr(edate,4,2)这个字段加进去,这时就按照时间也分组了。

       
错误解法:SQL> select substr(to_date('2005-10-17','yyyy-mm-dd'),4,2) as date2,empname,sum(
decode(sb,'迟到',1,0)) as 上班迟到次数,sum(decode(xb,'早退',1,0)) as 下班早退次
数 from employee group by empname;

DA EMPNAME              上班迟到次数 下班早退次数
-- -------------------- ------------ ------------
10 二傻                            0            1
10 大傻                            1            2

SQL> alter session set nls_date_format='yyyy-mm-dd';

会话已更改。

上面的会话将时间的格式变成了17-10月-05,所以利用alter session更改其格式。下面的是正确的写法。我写的那个是将时间固定了,如果有不同的时间就麻烦了。嘻嘻……

正确解法:SQL> Select empName 用户名,substr(edate,4,2) 月份,
  2  sum(decode(sb,'迟到',1,0)) as 上班迟到次数,
  3  sum(decode(xb,'早退',1,0)) as 下班早退次数
  4  from employee
  5  group by empname,substr(edate,4,2);

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8620228/viewspace-425532/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-10

  • 博文量
    7
  • 访问量
    7154