2017-06-21 21 views
1

私はかなり新しいSQLです。ここに私の最終目標は次のとおりです。12/31/15複数のテーブルを持つグループと合計のSQLコーディング

後に介護者によって暦日による労働時間の

合計は、ここで私は今

select br_ID, car_ID, car_FirstName, car_LastName, car_SkillCd, car_Role, car_EmpSubCod_UD, schst_Name, svcc_Name, dbo.ConvertTimeFromUtc(sch_StartTime , tz_Data), dbo.ConvertTimeFromUtc(sch_endtime , tz_Data), sch_Units, sch_PayDate, sch_PayUnits, cli_LastName, cli_FirstName 
from T_Schedules 
inner join T_Branches on br_ID = sch_BranchID 
inner join T_TimeZones on tz_ID = br_TimeZoneID 
Full outer join T_Caregiver ON T_schedules.sch_CaregiverID = T_Caregiver.car_ID 
full outer join T_ServiceCode on T_Schedules.sch_ServiceCodeID = T_ServiceCode.svcc_ID 
full outer join T_ScheduleStatus on T_schedules.sch_ScheduleStatusID = T_ScheduleStatus.schst_ID 
full outer join T_Client on T_Schedules.sch_ClientID = T_Client.cli_ID 
where sch_ScheduleStatusID = 3 and dbo.ConvertTimeFromUtc(sch_StartTime , tz_Data) >= '2016-01-01' 

誰もがどのグループに時間を知っているコードがあります介護者によって。一晩シフトすれば、その時間は2カレンダーの日の間に分けることができるので、私はスケジュールされた単位を合計するだけではなりません。

+1

なぜ完全完全結合を使用しますか? –

+0

sch_StartTimeとsch_EndTimeのDateTime値はありますか? –

+0

はい、sch_StartTimeとsch_Endtimeは、yyyy-mm-dd hh:mm:ss:000で書かれた日付時刻の値です。 –

答えて

0

一晩のシフトは少し問題であり、おそらく結果に偏りがあります。 あなたが戻って1日に1/2をシフトし、もう1日に1/2を持たない限り、SQLがあなたのためにできることは何もありません。私はこれに近づくだろうか(私は思う)ことにより、簡単なグループであり、それが十分であるかどうかを確認:

SELECT dbo.ConvertTimeFromUtc(sch_StartTime , tz_Data), 
br_ID, car_ID, car_FirstName, 
car_LastName, car_SkillCd, car_Role, 
car_EmpSubCod_UD, schst_Name, svcc_Name, 
dbo.ConvertTimeFromUtc(sch_endtime , tz_Data), 
SUM(sch_Units), 
sch_PayDate, sch_PayUnits, cli_LastName, cli_FirstName 
FROM T_Schedules 
INNER JOIN T_Branches on br_ID = sch_BranchID 
INNER JOIN T_TimeZones on tz_ID = br_TimeZoneID 
FULL OUTER JOIN T_Caregiver ON T_schedules.sch_CaregiverID = T_Caregiver.car_ID 
FULL OUTER JOIN T_ServiceCode on T_Schedules.sch_ServiceCodeID = T_ServiceCode.svcc_ID 
FULL OUTER JOIN T_ScheduleStatus on T_schedules.sch_ScheduleStatusID = T_ScheduleStatus.schst_ID 
FULL OUTER JOIN T_Client on T_Schedules.sch_ClientID = T_Client.cli_ID 

WHERE sch_ScheduleStatusID = 3 and dbo.ConvertTimeFromUtc(sch_StartTime , tz_Data) >= '2016-01-01' 

GROUP BY [sch_StartTime] 
+1

集計関数またはグループにないいくつかのフィールドがselect内にあります。 –

+0

非常に良いポイント、申し訳ありません私はそれで迅速にしようとしていた。これを貼り付けるときは、それをグループに含めてください。 – 2407319dms

0

問題:sch_endtimeからsch_StartTimeからのシフトが真夜中を超えることができ、ので、いくつかの時間は、一つに働きました。日といくつかの次の。

最初の日と次のクエリの2つのクエリを作成し、両方のセットをUNION ALLと一緒に貼り付けます。 WITH句で段階的に作成されたクエリは次のとおりです。

with worked as 
(
    select 
    sch_caregiverid as caregiverid, 
    dbo.ConvertTimeFromUtc(sch_StartTime, tz_Data) as starttime, 
    dbo.ConvertTimeFromUtc(sch_endtime, tz_Data) as endtime 
    from T_Schedules 
    where sch_ScheduleStatusID = 3 and dbo.ConvertTimeFromUtc(sch_StartTime , tz_Data) >= '2016-01-01' 
) 
, day1 as 
(
    select 
    caregiverid, 
    starttime, 
    case when day(starttime) <> day(endtime) then 
     datetimefromparts(year(starttime), month(starttime), day(starttime), 23, 59, 59, 999) 
    else 
     endtime 
    end as endtime 
    from worked 
) 
, day2 as 
(
    select 
    caregiverid, 
    datetimefromparts(year(endtime), month(endtime), day(endtime), 0, 0, 0, 0) as starttime, 
    endtime 
    from worked 
    where day(starttime) <> day(endtime) 
) 
, bothdays as 
(
    select caregiverid, starttime, endtime from day1 
    union all 
    select caregiverid, starttime, endtime from day2 
) 
, hours_worked as 
(
    select 
    caregiverid, 
    convert(date, starttime) as whichday, 
    sum(datediff(hour, starttime, endtime)) as total 
    from bothdays 
    group by caregiverid, convert(date, starttime) 
) 
select * 
from t_caregiver 
join hours_worked on hours_worked.caregiverid = t_caregiver.car_id; 
関連する問題