现在有3个表.我想根据这3个表,新组成另外一个表prot 
字段与表名如下:info (员工信息表)
----  -------
ID    员工ID
name  员工姓名unattinfo (非正常出勤信息表)
----   ----
ID      ID
uID     员工ID
udate   上班日期
Amtype  上午非正常情况(旷工,请假)
pmtype  上午非正常情况(旷工,请假)attinfo (正常出勤信息表)
-----     ------
ID          ID
aID       员工ID    
adate     上班日期
amlate    上午迟到分钟数
pmlate    下午迟到分钟数
tmlate    总迟到分钟数
amearly   上午早退分钟数
pmearly   下午早退分钟数
tmearly   总迟早退钟数
==========================================
根据上面的3个表。组成一个新表prot,想要的如下字段:
name 员工姓名 , amsut 上午出勤情况(包括,正常,迟到,早退,旷工,请假),  pmsut下午出勤情况(同上午一样) ,
date上班日期, attday出勤天数备注:上午出勤情况要根据 unattinfo (非正常出勤信息表)与
attinfo (正常出勤信息表)的字段来判断 
就是说:如果在某日员工上午迟到分钟数大于0 (在正常出勤信息表里)则上午出勤情况就是“迟到”如果是上午旷工(在非正常出勤信息表里)则上午出勤情况就是“旷工”了。
谢谢各位了。delphi程序判断与sql语句都要有啊。我会感激的,散分了,大侠。

解决方案 »

  1.   

    info (员工信息表) 
    ----  ------- 
    ID    员工ID 
    name  员工姓名 create table info
    (
    ID varchar2(10),
    name varchar2(10)
    );insert into info(id,name) values(1,1);
    insert into info(id,name) values(2,2);
    insert into info(id,name) values(3,3);
    insert into info(id,name) values(4,4);
    unattinfo (非正常出勤信息表) 
    ----  ---- 
    ID      ID 
    uID    员工ID 
    udate  上班日期 
    Amtype  上午非正常情况(旷工,请假) 
    pmtype  上午非正常情况(旷工,请假) create table unattinfo(
    id varchar(20),
    Fid varchar2(20),
    udate date,
    amtype varchar2(20),
    pmtype varchar2(20)
    );insert into unattinfo(id,fid,udate,amtype,pmtype) values(1,1,trunc(sysdate),'请假','矿工');
    insert into unattinfo(id,fid,udate,amtype,pmtype) values(2,2,trunc(sysdate),'','矿工');attinfo (正常出勤信息表) 
    -----    ------ 
    ID          ID 
    aID      员工ID    
    adate    上班日期 
    amlate    上午迟到分钟数 
    pmlate    下午迟到分钟数 
    tmlate    总迟到分钟数 
    amearly  上午早退分钟数 
    pmearly  下午早退分钟数 
    tmearly  总迟早退钟数 create table attinfo(
    aid varchar2(10),
    adate date,
    amlate integer,
    pmlate integer,
    tmlate integer,
    amearly integer,
    pmearly integer,
    tmearly integer
    );insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(1,trunc(sysdate),0,0,0,0,0,0);
    insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(2,trunc(sysdate),0,0,0,0,0,0);
      
    insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(3,trunc(sysdate),0,1,1,0,0,0);
    insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(4,trunc(sysdate),1,0,1,1,0,1);
    commit;select info.name,
      decode(unattinfo.amtype,null, 
         case when nvl(attinfo.amlate,0)>0 then '迟到' 
              when nvl(attinfo.amearly,0)>0 then '早退'
              else '正常'
         end 
      ,unattinfo.amtype) 上午出勤情况,
      decode(unattinfo.pmtype,null, 
         case when nvl(attinfo.pmlate,0)>0 then '迟到' 
              when nvl(attinfo.pmearly,0)>0 then '早退'
              else '正常'
         end 
      ,unattinfo.pmtype) 下午出勤情况
    from info,unattinfo,attinfo
    where info.id = unattinfo.fid(+)
      and info.id = attinfo.aid(+)
      

  2.   

    测试环境:
      os: windows 2003
      db: oracle 9.2.0.1
      

  3.   

    如果是sqlserver数据库,好像有些函数需要修改一下。info (员工信息表) 
    ----  ------- 
    ID    员工ID 
    name  员工姓名 create table info
    (
    ID varchar(10),
    name varchar(10)
    );insert into info(id,name) values(1,1);
    insert into info(id,name) values(2,2);
    insert into info(id,name) values(3,3);
    insert into info(id,name) values(4,4);
    unattinfo (非正常出勤信息表) 
    ----  ---- 
    ID      ID 
    uID    员工ID 
    udate  上班日期 
    Amtype  上午非正常情况(旷工,请假) 
    pmtype  上午非正常情况(旷工,请假) create table unattinfo(
    id varchar(20),
    Fid varchar(20),
    udate datetime,
    amtype varchar(20),
    pmtype varchar(20)
    );insert into unattinfo(id,fid,udate,amtype,pmtype) values(1,1,getdate(),'请假','矿工');
    insert into unattinfo(id,fid,udate,amtype,pmtype) values(2,2,getdate(),'','矿工');attinfo (正常出勤信息表) 
    -----    ------ 
    ID          ID 
    aID      员工ID    
    adate    上班日期 
    amlate    上午迟到分钟数 
    pmlate    下午迟到分钟数 
    tmlate    总迟到分钟数 
    amearly  上午早退分钟数 
    pmearly  下午早退分钟数 
    tmearly  总迟早退钟数 create table attinfo(
    aid varchar(10),
    adate datetime,
    amlate integer,
    pmlate integer,
    tmlate integer,
    amearly integer,
    pmearly integer,
    tmearly integer
    );insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(1,getdate(),0,0,0,0,0,0);
    insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(2,getdate(),0,0,0,0,0,0);
      
    insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(3,getdate(),0,1,1,0,0,0);
    insert into attinfo(aid,adate,amlate,pmlate,tmlate,amearly,pmearly,tmearly)
      values(4,getdate(),1,0,1,1,0,1);
    select info.name,
      case when unattinfo.amtype is null then
         case when isnull(attinfo.amlate,0)>0 then '迟到' 
              when isnull(attinfo.amearly,0)>0 then '早退'
              else '正常'
         end 
      else unattinfo.amtype 
      end  上午出勤情况,
      case when unattinfo.pmtype is null then
         case when isnull(attinfo.pmlate,0)>0 then '迟到' 
              when isnull(attinfo.pmearly,0)>0 then '早退'
              else '正常'
         end 
     else unattinfo.pmtype end  下午出勤情况
    from attinfo
    left join unattinfo on attinfo.aid = unattinfo.fid 
        and convert(varchar(10),unattinfo.udate,120) =  convert(varchar(10),attinfo.adate,120)
    left join info on info.id = attinfo.aid
      

  4.   

    大哥你好厉害。
    我看你还漏了2个字段
    还有一个date(上班日期)
    attday出勤天数 。
      

  5.   

    学习一下,好象不是很困难的事情.
    你建一个表,查询三个表里面的数据往表里面插入就是了!
     begin
          ADOQ.Connection := FrmDataModule.ADOCon;
          ADOQ1.Connection := FrmDataModule.ADOCon;
          ADOQ2.Connection := FrmDataModule.ADOCon;
           ADOQ.Close;
           ADOQ.SQL.Text := 'delete from show_laneTickets ';
           ADOQ.ExecSQL;       ADOQ.Close;
           ADOQ.SQL.Text := 'select * from show_laneTickets ';
           ADOQ.ExecSQL;       ADOQ1.Close;       ss:= '    select   * '
                           +'    from  '+datatable+'   '
                           +'   where    StatDate='+sStatYear+sStatMonth+sStatDay
                           +'  and   Shift='+sStatShift
                            +'  and   LaneID= '+laneid
                           +'  and ( recordtype&4=4 or recordtype&2=2)  '
                           +'  order  by  OperateTime  Asc';
           ADOQ1.SQL.Text := ss;       ADOQ1.Open;
           ADOQ1.First;
           while ADOQ1.Eof=false do
           begin
             ADOQ.Open;
             ADOQ.Last;
             ADOQ.Insert;
             //ADOQ.FieldByName('operator').AsString:=laneid;
             ADOQ.FieldByName('operator').AsString:=ADOQ1.FieldByName('operator').AsString;
             operatorid:=ADOQ1.FieldByName('operator').AsString;
              ADOQ2.Close;       ss:= '    select   * '
                           +'    from  '+usertable+'   '
                           +'   where '
                            +'     userID= '+operatorid;
           ADOQ2.SQL.Text := ss;       ADOQ2.Open;
           ADOQ.FieldByName('operatorName').AsString:=ADOQ2.FieldByName('username').AsString;         recordtype:= ADOQ1.FieldByName('recordtype').AsInteger;
             ADOQ.FieldByName('BeginTime').Asdatetime:=ADOQ1.FieldByName('OperateTime').Asdatetime;
             BeginTime:= ADOQ1.FieldByName('OperateTime').AsString;
             BeginTime:=FormatDateTime('yyyy-mm-dd hh:nn:ss',StrToDateTime(BeginTime));
             ADOQ.FieldByName('BeginTicket').AsInteger:=ADOQ1.FieldByName('PrintNumber').AsInteger;
             ADOQ.FieldByName('StatDate').AsInteger:=ADOQ1.FieldByName('StatDate').AsInteger;
            ADOQ.FieldByName('Shift').AsInteger:=ADOQ1.FieldByName('Shift').AsInteger;
            ADOQ.FieldByName('LaneID').AsInteger:=ADOQ1.FieldByName('LaneID').AsInteger;         ADOQ1.Next;
             recordtype:= ADOQ1.FieldByName('recordtype').AsInteger;
             ADOQ.FieldByName('endTime').Asdatetime:=ADOQ1.FieldByName('OperateTime').Asdatetime;
             endTime:= ADOQ1.FieldByName('OperateTime').AsString;
              endTime:=FormatDateTime('yyyy-mm-dd hh:nn:ss',StrToDateTime(endTime));         ADOQ.FieldByName('endTicket').AsInteger:=ADOQ1.FieldByName('PrintNumber').AsInteger;         ADOQ2.Close;
             ss:= '    select  count(*) as errorticket '
                           +'  from  '+datatable+'   '
                           +'  where    StatDate='+sStatYear+sStatMonth+sStatDay
                           +'  and   Shift='+sStatShift
                           +'  and   LaneID= '+laneid
                           +'  and  (OperateTime >=''' +BeginTime+''''+')   and   (OperateTime <='''+endTime +''''
                           +')  and RecordType&256 =256 and recordtype&128<>128 and recordtype&8<>8 '
                           +' and PrintNumber<>0 ';
             ADOQ2.SQL.Text:=ss;
             ADOQ2.Open;
             ADOQ.FieldByName('ErrorTicket').AsInteger:=ADOQ2.FieldByName('ErrorTicket').AsInteger;         ADOQ1.Next;
             ADOQ.Post;
           end;
           ADOQ.Close;
           //ADOQ.SQL.Text := 'select * from show_laneTickets ';
            ss:= '    select   * '
                           +'    from   show_laneTickets  '
                           +'   where    StatDate='+sStatYear+sStatMonth+sStatDay
                           +'  and   Shift='+sStatShift
                            +'  and   LaneID= '+laneid
                           +'    '
                           +'  order  by  BeginTime  Asc';
           ADOQ.SQL.Text := ss;
           ADOQ.ExecSQL;
           RMDBDataSet.DataSet := ADOQ;
           RMReport.LoadFromFile(TreeList.ColumnByName('ReportPathName').Values[Node.index]);
        t := RMReport.FindObject('StationName');
        if t <> nil then t.Memo.Text := sStationName;
       //FrmWait.Free;
       // RMReport.ShowReport;
         end
    参考一下,呵呵
      

  6.   


    不好意思啊。我试你的sql语句。在 " else unatt.amtype 
    end  上午出勤情況,"   老通不过。。
      

  7.   

    帮LZ在SQL SERVER2000中测试了没有错误!/*
    1 请假 矿工
    2 矿工
    3 正常 迟到
    4 迟到 正常
    */
      

  8.   

    不好意思啊。我试你的sql语句。在 " else unatt.amtype 
    end  上午出勤情況,"  老通不过。。
    注意:你把表名改了,原句:'else unattinfo.pmtype end  下午出勤情况'