ichxxt2 2012-08-22 16:27
浏览 666
已采纳

排班查询

值班数据库表有几个字段:
员工ID,日期,上班类型(早,中,晚)

实现一个存储过程,能列出排班表,如:

EID 周一 周二 周三

日期 8-20 8-21 8-22

001 早 中 晚
002 早 早 中

如果数据库字段不方便实现结果可以重新设计。存储过程也不一定要有,只要关键的查询语句就行了。

  • 写回答

2条回答 默认 最新

  • iteye_7115 2012-08-23 10:33
    关注

    模拟数据:

    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()),当然在你实际需求中你可以写存储过程,根据我这个思路查出所有数据,然后组织处理下以达到相同效果

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如果要做一个老年人平板有哪些需求
  • ¥15 k8s生产配置推荐配置及部署方案
  • ¥15 matlab提取运动物体的坐标
  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥15 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码
  • ¥15 stm32标准库的PID角度环