此题也是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);