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条)

报告相同问题?

悬赏问题

  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥15 Prism框架ItemControl元素绑定ViewModel中的命令失败
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥20 想写一个文件管理器,加载全部子文件夹后,要一级一级返回
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?
  • ¥15 请问GPT语言模型怎么训练?
  • ¥15 已知平面坐标系(非直角坐标系)内三个点的坐标,反求两坐标轴的夹角
  • ¥15 webots有问题,无响应
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?