-2

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))
          )
4

2 に答える 2

0

TB1のすべての列が必要であると仮定すると、このクエリは必要なものを取得するはずです。

SELECT * 
FROM TB1 
WHERE ID IN 
      (SELECT ID 
       FROM TB3 
       WHERE confirmationStatus = 1 
         AND scheduleID IN 
             (SELECT ID 
              FROM TB2 
              WHERE DATE(dateScheduled) = 'YOUR_ENTERED_DATE'))

将来的には、使用しているもの(mySQL、SQL Serverなど)を正確に含めることもできます。

于 2013-03-26T16:04:28.747 に答える
0

ついにできた。

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
(
NOT EXISTS
    (
        SELECT * FROM [tbl_schedule] T2 WHERE
        NOT EXISTS
        (
            SELECT * FROM [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.userId = T1.id AND CONVERT(date,T2.scheduledDate) = CONVERT(date,@dataAg)
    )
)

とにかくありがとう。

于 2013-03-27T03:15:06.433 に答える