每周求和数据SQL查询

时间:2016-08-31 08:47:26

标签: sql sql-server sql-server-2008

我试图总结alias列。我的英语不好,所以我会列出我想做的事情。

  1. 2周内出席
  2. 如果员工一周工作时间超过08:00 hours,他将获得RO(可以多次)
  3. 现在,我能够通过员工一天的额外时间来显示结果。

    这是我的查询

    select 
        a.Nip, b.FullName, c.attendancedate, c.inTime, c.OutTime,
        DATEPART(wk, c.attendanceDate) week, 
        case 
           when DATEADD(HOUR, -8, OutTime) <= InTime then '00:00' 
           else CONVERT(VARCHAR(5),DATEADD(HOUR, -8, OutTime - InTime), 108) 
        end AS total  
    from 
        DinasHoDetail a 
    left join 
        Employee b on a.Nip = b.Nip
    left join 
        DinasHoHeader d on a.KodeDinasHeader = d.KodeDinasHeader
    left join 
        attendance c on a.Nip = c.Nip and attendancedate between d.startdate and d.enddate
    

    这是结果

    enter image description here

    因此,在使用ro进行总调用后,我还可以再添加一列。 ro将包含total/8 hours group by week & Nip

    的值

    从第36周开始,Nip 1502427就是一个例子

    02:00 + 02:00 + 02:00 / 8 hours
    

    抱歉我的英语不好。

    我真的想在Fiddle创建我的表格。每次运行查询时,我总是会收到错误

2 个答案:

答案 0 :(得分:2)

使用CTE,您可以通过多种方式返回查询:

with BaseQuery as
(

select a.Nip,b.FullName,c.attendancedate,c.inTime,c.OutTime,DATEPART( wk, c.attendanceDate) week, 
case 
  when DATEADD(HOUR, -8, OutTime) <=InTime then 0 
  else DATEDIFF(HOUR, InTime, OutTime) - 8
  end AS total  
from DinasHoDetail a 
left join Employee b on a.Nip = b.Nip
left join DinasHoHeader d on a.KodeDinasHeader = d.KodeDinasHeader
left join attendance c on a.Nip =c.Nip and attendancedate 
between d.startdate and d.enddate

)

select B1.Nip, B1.FullName, B1.AttendanceDate, B1.InTime, B1.OutTime, B1.Week, B1.Total, B2.RO
from BaseQuery B1
inner join 
(
select Nip, Week, sum(Total)/8 as RO
from BaseQuery
group by Nip, Week
) B2
on B2.Week = B1.Week
and B2.Nip = B1.Nip

答案 1 :(得分:2)

GROUP BY和日期函数计算每个Nip和工作日的RO

select a.Nip,b.FullName,DATEPART( wk, c.attendanceDate) week, 
   sum(case 
      when DATEADD(HOUR, -8, OutTime) <=InTime then 0 
      else DATEDIFF(HOUR, InTime, OutTime) - 8
      end)/8 AS RO  
from DinasHoDetail a 
left join Employee b on a.Nip = b.Nip
left join DinasHoHeader d on a.KodeDinasHeader = d.KodeDinasHeader
left join attendance c on a.Nip =c.Nip and attendancedate 
between d.startdate and d.enddate
group by a.Nip,b.FullName,DATEPART( wk, c.attendanceDate)