值班数据库表有几个字段:
员工ID,日期,上班类型(早,中,晚)
实现一个存储过程,能列出排班表,如:
EID 周一 周二 周三
日期 8-20 8-21 8-22
001 早 中 晚
002 早 早 中
如果数据库字段不方便实现结果可以重新设计。存储过程也不一定要有,只要关键的查询语句就行了。
值班数据库表有几个字段:
员工ID,日期,上班类型(早,中,晚)
实现一个存储过程,能列出排班表,如:
EID 周一 周二 周三
001 早 中 晚
002 早 早 中
如果数据库字段不方便实现结果可以重新设计。存储过程也不一定要有,只要关键的查询语句就行了。
模拟数据:
EMPLOYEE_ID DTIME TYPE
001 2012-8-20 早
001 2012-8-21 中
001 2012-8-22 中
001 2012-8-23 晚
001 2012-8-24 早
002 2012-8-20 中
002 2012-8-21 早
002 2012-8-22 早
002 2012-8-23 晚
002 2012-8-24 早
001 2012-8-27 早
001 2012-8-28 中
001 2012-8-29 晚
代码:
[code="sql"]
select rn,employee_id,
max(decode(weekday,'星期一',to_char(dtime,'yyyy-mm-dd')||'('||type||')')) "周一",
max(decode(weekday,'星期二',to_char(dtime,'yyyy-mm-dd')||'('||type||')')) "周二",
max(decode(weekday,'星期三',to_char(dtime,'yyyy-mm-dd')||'('||type||')')) "周三",
max(decode(weekday,'星期四',to_char(dtime,'yyyy-mm-dd')||'('||type||')')) "周四",
max(decode(weekday,'星期五',to_char(dtime,'yyyy-mm-dd')||'('||type||')')) "周五"
from (
select employee_id,
dtime,
type,
weekday,
rank() over(partition by employee_id, weekday order by dtime) rn
from (select a.*, to_char(a.dtime, 'day') weekday
from t a
order by a.employee_id, dtime)
)
group by rn,employee_id
order by employee_id,rn
[/code]
实现效果:
RN EMPLOYEE_ID 周一 周二 周三 周四 周五
1 001 2012-08-20(早) 2012-08-21(中) 2012-08-22(中) 2012-08-23(晚) 2012-08-24(早)
2 001 2012-08-27(早) 2012-08-28(中) 2012-08-29(晚)
1 002 2012-08-20(中) 2012-08-21(早) 2012-08-22(早) 2012-08-23(晚) 2012-08-24(早)
这个用oracle的一条sql实现(为了实现跨周,用到的oracle中的分析函数rank() over()),当然在你实际需求中你可以写存储过程,根据我这个思路查出所有数据,然后组织处理下以达到相同效果