我现在有一张表,建表语句如下
CREATE TABLE REPRECORD(
ID INT NOT NULL,
ASSIGNID INT NOT NULL,
CATE1NAME VARCHAR2(20) NOT NULL,
CATE2NAME VARCHAR2(20),
WORKERID VARCHAR2(20) NOT NULL,//工人ID
WORKERNAME VARCHAR2(20) NOT NULL,//工人姓名
CHARGEID VARCHAR2(20) NOT NULL,
ARRANGETIME DATE NOT NULL,//维修派出时间
FINISHTIME DATE,//维修完成时间
SCORE1 INT,
SCORE2 INT,
SCORE3 INT,
REPRESULTID VARCHAR2(20) NOT NULL,//维修状态,1为成功,2为失败
FREASON VARCHAR2(40),
PRIMARY KEY (ID),
FOREIGN KEY(ASSIGNID) REFERENCES REPREQUEST(ID),
FOREIGN KEY(WORKERID) REFERENCES USERS(DBUSER)
);我现在在写一条sql语句,包括以下几个内容:工人id,该工人维修完成工时,该工人维修成功个数,该工人维修失败个数,总个数。
完成时间减去派出时间就是这个工人维修一个成功的时间。工时的意思就是我一个工人维修成功的这些总时间加起来除以成功的个数。比如一个工人有5个任务,他有3个成功了,第一个耗费2小时,第二个耗费3小时,第三个耗费4小时,他的平均工时就是(2+3+4)/3.这个工人对应的一条表数据就是工人id(假设为001),(2+3+4)/3,3,2,5。我就是不会算这个平均工时,数据库里arrangetime与finishtime都是精确到秒的,比如说2012-01-01 14:12:11.但我算的时候想让时间精确到小时就够了。求助一下各位,能不能帮我看看这个。万分感谢

解决方案 »

  1.   

    select trunc(sysdate,'HH24') from dual ;
    这个是精确到小时的
      

  2.   

    把下面的表名test_a换成你自己的表名:
    select succ_sub.WORKERID "工人id", 
           succ_sub.succ_cnt "维修成功个数", 
           succ_sub.averagetime "维修完成工时", 
           nvl(fail_sub.fail_cnt, 0) "维修失败个数",
           (succ_sub.succ_cnt+nvl(fail_sub.fail_cnt, 0)) "总个数"
      from
           (select succ_sub.WORKERID WORKERID, count(1) succ_cnt, sum(succ_sub.workhours)/count(1) averagetime
              from
                   (select WORKERID, WORKERNAME, round((FINISHTIME-ARRANGETIME)*24) workhours from test_a
                     where REPRESULTID = '1') succ_sub
                  group by succ_sub.WORKERID
           )  succ_sub,
           (select WORKERID, count(1) fail_cnt from test_a where REPRESULTID = '2' group by WORKERID) fail_sub
     where succ_sub.WORKERID = fail_sub.WORKERID(+)
      

  3.   

    非常感谢,但是我试了之后还有一个问题,就是比如说我有一个工人001,他的所有维修记录都是失败的,这句sql不能把这个工人001的信息调出来。也就是只有最少有一次是成功的,这个查询才生效。不知道该怎么解决。
      

  4.   

     维修没有成功就是0个,不可能被除数为0 的。可不可以重新写一个sql语句查找一次都没有维修成功的人。
      

  5.   

    select t.workerid,
           sum(decode(t.represultid, 1, 1, 2, 0)) as  a,
           sum(decode(t.represultid, 1, 0, 2, 1)) as b,
           sum(decode(t.represultid,
                      1,
                      (trunc(t.finishtime) - trunc(t.arrangetime)),
                      2,
                      0)) / nvl(sum(decode(t.represultid, 1, 1, 2, 0)), 1) as c
      from reprecord t
     group by t.workerid