SQLServer2008用のこのSQLクエリの作成を手伝ってください。
私はこれを考えて1日を無駄にしましたが、解決策を見つけることができません:
それぞれ(列)を持つ3つの[テーブル]があります:
[table_users]
TB1(Id, Name)
[table_schedule]
TB2(Id, userId, dateScheduled)
[table_schedule_confirmation]
TB3(Id, scheduleId, confirmationStatus)
確認ステータス->0=キャンセル、1=確認済み
[TB1]
日を選択してフィルタリングする必要があります。次のようなユーザー名のみをリストする必要があります。
- まったくスケジュールされて
userId
いません(選択した日に存在しません[TB2]
)
また
scheduleId
スケジュールされている場合は、( )の一致確認が[TB3]
あり、(confirmationStatus
)は0(キャンセル)である必要があります
問題:
TB2
と日付TB3
には複数のエントリが存在する可能性がありますuserId
日付フィルター=2013年3月31日
状況1(1つの確認済みスケジュール):
状況1http://img255.imageshack.us/img255/1508/sqld.png
ご覧のとおり、ユーザー1には4回のスケジュールを設定しましたが、最初に3回キャンセルし、4回目のみ確認しました。
状況2(1つの保留中のスケジュール):
状況1http://img854.imageshack.us/img854/8116/sql2s.png
この場合、ユーザーは4番目(id = 16)のスケジュールをまだ確認していません。
状況3(すべてのスケジュールがキャンセルされました):
状況1http://img41.imageshack.us/img41/5720/sql3s.png
ユーザーは4つのスケジュールすべてをキャンセルしました。
状況4(その日のユーザーのスケジュールはありません):
状況1http://img255.imageshack.us/img255/9679/sql4.png
選択した日のスケジュールはありません。
履歴書:
日付でフィルタリングするには、状況3と4に適用され、状況1と2には適用されないユーザーのみをリストする必要があります。
その日に利用可能なユーザーのみをドロップダウンに表示するには、このフィルターを作成する必要があります。
これは私がこれまでに試したことです:
DECLARE @dataAg datetime SET @dataAg = '2013/03/31 16:30'
SELECT T1.id, T1.name
FROM [tbl_users] T1
WHERE
(NOT EXISTS
(SELECT *
FROM [tbl_schedule] T2
WHERE T2.userId = T1.id
AND CONVERT(date,T2.scheduledDate) = CONVERT(date, @dataAg))
)
OR
(EXISTS
(SELECT *
FROM [tbl_schedule] T2, [tbl_scheduleConfirmation] T3
WHERE T2.id = T3.idSchedule
AND T2.userId = T1.id
AND CONVERT(date,T2.scheduledDate) = CONVERT(date, @dataAg))
AND
NOT EXISTS
(SELECT *
FROM [tbl_schedule] T2, [tbl_scheduleConfirmation] T3
WHERE T2.id = T3.idSchedule
AND T3.confirmation = 1
AND T2.idUser = T1.id
AND CONVERT(date, T2.scheduledDate) = CONVERT(date, @dataAg))
)