2016-08-31 18 views
0

Ich versuche, alias Spalten zu summieren. Ich bin schlecht auf Englisch, also werde ich eine Liste darüber machen, was ich machen möchte.Summe Daten pro Woche SQL-Abfrage

  1. Es ist ein Besuch in 2 Wochen
  2. Wenn die Mitarbeiter mehr als 08:00 hours in einer Woche haben Arbeit wird er RO bekommen (kann mehrere)

Vorerst Ergebnisse Ich bin in der Lage zu zeigen, mit der Extratime, die Angestellte an einem Tag haben.

Hier ist meine Abfrage

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 

Und hier ist das Ergebnis

enter image description here

So kann ich eine weitere Spalten nach insgesamt mit ro genannt hinzufügen. Die ro einen Wert von total/8 hours group by week & Nip

Von Woche 36 und Nip enthält hier 1.502.427 ist das Beispiel

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

Es tut mir leid für mein schlechtes Englisch.

Ich möchte wirklich meine Tabelle in Fiddle erstellen. Jedes Mal, wenn ich die Abfrage ausführen ich immer einen Fehler

Antwort

2

GROUP BY und Datumsfunktionen RO berechnen für jeden Nip und Wochentag

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) 
+0

jetzt finde ich etwas neues. Das ist 'Summe (Fall)' danke. – YVS1102

+0

kann ich nur die gesamte ro bekommen? – YVS1102

+0

Ja, wickle obige Abfrage in 'select sum (RO) von (...) q' – Serg

2

einen CTE verwenden, können Sie auf die Abfrage auf mehrere Arten verweisen:

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 
+0

danke für die Antwort. Ich habe versucht, Ihre Antwort, ich bekomme diesen Fehler 'Operand Datentyp VARCHAR ist ungültig für Summe Operator' Ich denke, in diesem Teil' wählen Nip, Woche, Summe (Gesamt)/8 als RO' – YVS1102

+0

Ja, ich habe gerade bemerkt, Sie setze das toal als varchar ... Meine schlechte – JohnHC

Verwandte Themen