日期:2014-05-17  浏览次数:20744 次

征集一个查询语句
现有数据如下:
部门 工号 姓名 日期 时间
安全环境监督部 574 杨业 2011/12/01 07:58
安全环境监督部 574 杨业 2011/12/01 17:31
安全环境监督部 574 杨业 2011/12/02 07:53
安全环境监督部 574 杨业 2011/12/02 07:55
安全环境监督部 574 杨业 2011/12/02 19:47
安全环境监督部 574 杨业 2011/12/04 08:07
安全环境监督部 574 杨业 2011/12/04 17:22

希望通过查询得到如下的结果:
部门 工号 姓名 日期 时间 刷卡次数
安全环境监督部 574 杨业 2011/12/01 07:58 17:31 2
安全环境监督部 574 杨业 2011/12/02 07:53 07:55 19:47 3
安全环境监督部 574 杨业 2011/12/04 08:07 17:22 2

其中关键难点在,组合时间数据串和统计当日记录数2项数据上,请高手赐教!

------解决方案--------------------
SQL code
select 部门 ,工号 ,姓名 ,日期 ,
replace(wm_concat(时间),',',' '),
count(时间)
from tb group by 部门 ,工号 ,姓名 ,日期

------解决方案--------------------
SQL code
SELECT 部门, 工号, 姓名, 日期, MIN(时间), COUNT(1)
  FROM TAB
 GROUP BY 部门, 工号, 姓名, 日期

------解决方案--------------------
select 部门 ,工号 ,姓名 ,日期 ,
replace(wm_concat(时间),',',' '),
count(时间)
from tb group by 部门 ,工号 ,姓名 ,日期
------解决方案--------------------
先创建一个嵌套表,把嵌套表作为另一个新表的列。然后,用以上的记录对这个表自动进行填充,把相同的日期作为一列,不同一时间作为嵌套记录。最后对这个表时行查询,用CASE把嵌套的列记录转换为行记录,再加上嵌套表中的记录数。就OK了。
------解决方案--------------------
为什么是这种啊 ……
安全环境监督部 574 杨业 2011/12/03 0
如果只有红色的这种记录

如果时间是date型就没有必要转换了,我这边是字符所以to_date
SQL code
with tb as
(select '安全环境监督部' d , '574' n, '杨业' m , '2011/12/01' r, '07:58' q from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/01', '17:31' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:53' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:55' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '19:47' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '08:07' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '17:22' from dual )
select '安全环境监督部', '574', '杨业' ,t1.r,t2.jl,nvl(t2.rn,0)from
(select (to_date((select min(r)from tb),'YYYY/MM/DD')+rownum-1) r 
from dual connect by rownum<=(select max(to_date(r,'YYYY/MM/DD'))-min(to_date(r,'YYYY/MM/DD'))from tb)+1) t1
,(select '安全环境监督部', '574', '杨业' ,r ,replace(wm_concat(q),',',' ') jl,count(q) rn
from tb group by r )t2 
where t1.r=t2.r(+) 
order by t1.r

------解决方案--------------------
select t.deptid 部门号,t.empid 员工号,t.empname 姓名,t.riqi 日期,min(t.shijian)||' '||max(t.shijian) 时间,count(*) 次数
from shuaka t
group by t.deptid,t.empid,t.empname,t.riqi
------解决方案--------------------
SQL code

create table T12 as
select '安全环境监督部' d , '574' n, '杨业' m , '2011/12/01' r, '07:58' q from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/01', '17:31' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:53' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:55' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '19:47' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '08:07' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '17:22' from dual;

select d ,n ,m ,r ,
replace(wm_concat(q),',',' '),
count(q)
from t12 group by  d ,n ,m ,r

------解决方案--------------------
如果想要每天的日期都显示出来 可以用下表来关联你的查询表a

SQL code

select b.sdate ,a.* from
(select to_char(to_date('2011-12', 'YYYY-MM') + rownum - 1, 'YYYY-MM-DD') as sdate from dual
       connect by rownum <= to_number(to_char(last_day(to_date('2011-12', 'YYYY-MM')), 'dd'))) b
left jion b.sdate=a.日期