基本的に私がやろうとしていることは、日付範囲内(月単位)で該当するサービスを利用しているユーザーがいる
ユーザーがサービスを利用できる時間 (時間単位) と、予定データを保持するテーブルに基づいてスケジュールした時間数を表示できるようにしたい
だから私はそれが基本的に次のようになりたい
user service available scheduled
-----------------------------------------------------------------
User1 Service1 120 7
User1 Service2 40 0
スケジュールされた列は、テーブルSUM
のStart
とEnd
フィールドを取得して計算されAppointment
ます。
今私の問題は、予定がスケジュールされていない場合、上記で必要な情報を表示する方法がわからないことです。
テーブル間の関係は次のとおりです。
- ユーザーあたり 1 NOA
- NOA ごとに複数のサービス
サービスごとに 1 つの FormType
Appointment は FormTypeID を
FK
- ClientAppointment は、AppointmentID と UserID (割り当てられた NOA を持つ同じユーザー) を保持します。
SELECT
--NOA
noa.noaID, noa.userID as 'ClientUserID',
--Service
service.BillingCode + service.MOD1 + service.MOD2 + service.MOD3 + service.MOD4 AS BillingCode, service.FormTypeID, service.StartDate, service.EndDate, service.CurrentUnits, service.Adjustment,
--Scheduler
scheduler.*
FROM LEL_NOA noa
LEFT JOIN LEL_Service service ON service.noaID = noa.noaID
LEFT OUTER JOIN
(
SELECT ca.ClientID, SUM(DATEDIFF(second, a.Start, a.[End]) / 3600) as ScheduledUnits FROM LEL_Scheduler_Appointment a
LEFT JOIN LEL_Scheduler_ClientAppointment ca ON a.ApptID = ca.ApptID
WHERE a.Start BETWEEN '1/1/2012' and '1/31/2012'
AND a.[End] BETWEEN '1/1/2012' and '1/31/2012'
GROUP BY ca.ClientID
) AS scheduler ON noa.UserID = scheduler.ClientID
WHERE noa.UserID = 4
AND service.StartDate BETWEEN '1/1/2012' and '1/31/2012'
AND service.EndDate BETWEEN '1/1/2012' and '1/31/2012'
ORDER BY 'ClientUserID', BillingCode, FormTypeID, StartDate
上記の手順では、21 利用可能、7 予定の月に引き戻されますが、 の人はUserID = 4
その期間に別のサービスを持っているので、表の次の項目として 0 時間予定の情報を表示したいと思います。
(noaID, ClientUserID, BillingCode, FormTypeID, StartDate, EndDate, CurrentUnits, Adjustment, ScheduledUnits) VALUES
(203, 25, 'x888', 6, '4/16/2012 4:24:19 PM', '4/16/2012 4:24:19 PM', 0, 0, 5.000000),
(203, 25, 'x999', 1, '4/1/2012 12:00:00 AM', '4/30/2012 12:00:00 AM', 10, 0, 5.000000)
問題は、最初のエントリで予定がまったくないのに、まだ 5 が表示されていることです (2 番目の合計は正しいです)。