现有数据如下:
部门 工号 姓名 日期 时间
安全环境监督部 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 allselect '安全环境监督部', '574', '杨业', '2011/12/01', '17:31' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/02', '07:53' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/02', '07:55' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/02', '19:47' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/04', '08:07' from dual union allselect '安全环境监督部', '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) rnfrom 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 asselect '安全环境监督部' d , '574' n, '杨业' m , '2011/12/01' r, '07:58' q from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/01', '17:31' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/02', '07:53' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/02', '07:55' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/02', '19:47' from dual union allselect '安全环境监督部', '574', '杨业', '2011/12/04', '08:07' from dual union allselect '安全环境监督部', '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'))) bleft jion b.sdate=a.日期