2

基本的に私がやろうとしていることは、日付範囲内(月単位)で該当するサービスを利用しているユーザーがいる

ユーザーがサービスを利用できる時間 (時間単位) と、予定データを保持するテーブルに基づいてスケジュールした時間数を表示できるようにしたい

だから私はそれが基本的に次のようになりたい

user             service             available         scheduled
-----------------------------------------------------------------
User1            Service1            120               7
User1            Service2            40                0

スケジュールされた列は、テーブルSUMStartEndフィールドを取得して計算され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 番目の合計は正しいです)。

4

2 に答える 2

1

インライン サブクエリを使用するようにクエリを修正してみてください。パフォーマンスが低下する可能性がありますが、正しいクエリを取得しやすくなります。

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
(
    SELECT COALESCE(SUM(DATEDIFF(second, a.Start, a.[End]) / 3600), 0) as ScheduledUnits
    FROM LEL_Scheduler_Appointment a
        INNER 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'
        AND ca.ClientID = noa.UserID
        AND a.ServiceID = FormTypeID
) as ScheduledUnits
FROM LEL_NOA noa
    LEFT JOIN LEL_Service service ON service.noaID = noa.noaID
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
于 2012-04-19T19:08:44.347 に答える
1

ORDER BY 句の上に UNION ALL 行を追加してから、特にスケジュールなしで同じユーザーの情報を取得する新しい SELECT クエリを追加します。NULL 値をハードコードする必要がある場合でも、新しいクエリに最上位のクエリと同じ列があることを確認してください。一般的な構文は次のとおりです。

SELECT [stuff] FROM Table1 WHERE [A]
UNION ALL
SELECT [samestuff] FROM Table1 WHERE [B]
ORDER BY [somestuff]
于 2012-04-19T18:17:14.077 に答える