网上查了很多资料都没有找到合适的方法,希望有高手能帮帮忙表字段如下:
ID    员工名称    员工编码    签到日期    签到时间    类型
-------------------------------------------------------------
1      Admin     0001   2013-06-01  09:00      0
2      Admin     0001   2013-06-02  09:10      1
3      xiaoxu    0003   2013-06-01  09:03      1
4      xiaoZh    0002   2013-06-01  09:00      0
.......--------------------------------------------------------------
想要实现结果:员工名称    员工编码   1号      2号     3号     4号      5号 ................31号
Admin     0001     09:00  09:10   null   null   null................null
xiaoxu    0003     09:03  null    null   null   null................null
xiaoZh    0002     09:00  null    null   null   null................null
...........这个比较急,请大家帮忙

解决方案 »

  1.   

    补充下 是Oracle数据库的,不是SQLSERVER
      

  2.   

    看下这个帖子,很像。里面有我写的sql
    http://bbs.csdn.net/topics/390481097
      

  3.   

    是的,只有一条签到记录,查询条件是按月份或者是人进行查询就可以了。我刚才试了你之前写的办法row_number() over(partition by 员工名称 order by 签到时间) 它的值跟日期对应不上,也就是显示的结果,明明是5号跟6号,跑到1号跟2号去了。
      

  4.   


    1.每个员工每天是不是只有一条 签到记录?2.如果某员工里面既有 6月 的也有 7月的 怎么搞? 
    select t.员工名称,t.员工编码,t.手机号码,
           max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 1号,
           max(decode(rn, 2, to_char(t.签到时间,'hh24:mi:ss'))) 2号,
           max(decode(rn, 3, to_char(t.签到时间,'hh24:mi:ss'))) 3号,
           max(decode(rn, 4, to_char(t.签到时间,'hh24:mi:ss'))) 4号,
           max(decode(rn, 5, to_char(t.签到时间,'hh24:mi:ss'))) 5号,
           max(decode(rn, 6, to_char(t.签到时间,'hh24:mi:ss'))) 6号
      from (select t.*,
                   to_char(t.签到日期,'dd') rn
              from t) t
     group by  t.员工名称,t.员工编码,t.手机号码 
    //以上语句运行以后可以得到我想要的结果,那么如果我要在日期加个类型(比如:1号  类型  2号  类型) 该怎么实现 max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 1号,
    max(decode(rn,1,type)) 类型,
    max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 2号,
    ....
    这种 方法不适合  我之前有看过可以直接成一句。请指教
      

  5.   


    你这个 其实只要把 日期的 天截下来,判断下就可以了select t.empno,
           max(decode(t.d, '01', t.kq_time)) "1号",
           max(decode(t.d, '02', t.kq_time)) "2号",
           max(decode(t.d, '03', t.kq_time)) "3号",
           max(decode(t.d, '04', t.kq_time)) "4号",
           max(decode(t.d, '05', t.kq_time)) "5号"
      from (select t.*, substr(t.kq_date, -2) d from t) t
     group by t.empno
      

  6.   


    你这个 其实只要把 日期的 天截下来,判断下就可以了select t.empno,
           max(decode(t.d, '01', t.kq_time)) "1号",
           max(decode(t.d, '02', t.kq_time)) "2号",
           max(decode(t.d, '03', t.kq_time)) "3号",
           max(decode(t.d, '04', t.kq_time)) "4号",
           max(decode(t.d, '05', t.kq_time)) "5号"
      from (select t.*, substr(t.kq_date, -2) d from t) t
     group by t.empno
    嗯,现在我想把类型也加上,不知道您有什么好的办法吗?
      

  7.   


    1.每个员工每天是不是只有一条 签到记录?2.如果某员工里面既有 6月 的也有 7月的 怎么搞? 
    select t.员工名称,t.员工编码,t.手机号码,
           max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 1号,
           max(decode(rn, 2, to_char(t.签到时间,'hh24:mi:ss'))) 2号,
           max(decode(rn, 3, to_char(t.签到时间,'hh24:mi:ss'))) 3号,
           max(decode(rn, 4, to_char(t.签到时间,'hh24:mi:ss'))) 4号,
           max(decode(rn, 5, to_char(t.签到时间,'hh24:mi:ss'))) 5号,
           max(decode(rn, 6, to_char(t.签到时间,'hh24:mi:ss'))) 6号
      from (select t.*,
                   to_char(t.签到日期,'dd') rn
              from t) t
     group by  t.员工名称,t.员工编码,t.手机号码 
    //以上语句运行以后可以得到我想要的结果,那么如果我要在日期加个类型(比如:1号  类型  2号  类型) 该怎么实现 max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 1号,
    max(decode(rn,1,type)) 类型,
    max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 2号,
    ....
    这种 方法不适合  我之前有看过可以直接成一句。请指教这种方法怎么不适合呢?
    直接成一句的写法,不会吧。另外,如果不要type,还有一种简单的写法,pivot
    with tt as
     (select t.empno, t.kq_time, substr(t.kq_date, -2) d from t)
    select * from tt pivot(max(kq_time) for d in('01', '02', '03', '04', '05'))
      

  8.   


    你的表不是有个类型type 是判断是否迟到的吧?那 
    max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 1号,
    max(decode(rn,1,type)) 类型,
    max(decode(rn, 1, to_char(t.签到时间,'hh24:mi:ss'))) 2号,我感觉是可以的啊?
      

  9.   

    感觉也没特殊的呀 一般的动态行转列 网上很多例子 百度:oracle 动态行转列
      

  10.   

    LZ 如果要加上类型维度的话,需要判断一下时间,比如:
     case when to_char(t.签到时间,'hh24:mi:ss')>'09:00:00' then '迟到' ELSE '正常上班' end 类型