2013-02-14 38 views
2

以下SQL查詢應顯示教師可用性。有3種可能的預訂類型 - 上午,下午或全天。如果是AM預訂,則單元格中的文本應顯示PM,如果是PM預訂,則應顯示AM,如果是全天預訂,或AM和PM預訂都顯示爲「xxx」。MIN的替代選擇多個行

這一切工作正常時,上午1時,下午1或1整天預訂,但如果上午1點和下午1點在同一天,它不會顯示XXX,因爲我使用MIN()。我怎樣才能在一天內評估所有預訂,而不是最小的預訂? (你可以看到我試圖說明我的意思上的代碼,週四部分

SQL:

with CTE_D as 
( 
    SELECT 
     DATEADD(ww, DATEDIFF(ww,0,GETDATE()), 0) as BookingDate 

    UNION ALL 

    SELECT 
     DATEADD(day, 1, BookingDate) 
    FROM 
     CTE_D 
    WHERE 
     BookingDate < DATEADD(ww, DATEDIFF(ww,0,GETDATE()), 6) 
) 
SELECT 
    t.ID, t.Firstname, 
    t.Surname, tb.Band, t.Telephone, t.Mobile, t.Teacher, t.TeacherAssistant, t.PrimarySchool, t.SecondarySchool, 
    MIN(CASE WHEN bd.DayText = 'Monday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Monday", 
    MIN(CASE WHEN bd.DayText = 'Tuesday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Tuesday", 
    MIN(CASE WHEN bd.DayText = 'Wednesday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Wednesday", 
    MIN(CASE WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 0 THEN 'PM' WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 1 THEN 'AM' WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 2 or (bd.BookingDuration = 1 and bd.BookingDuration = 0) THEN 'xxx' END) "Thursday", 
    MIN(CASE WHEN bd.DayText = 'Friday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Friday", 
    Notes 
     FROM Teachers t 
     cross join CTE_D d 
     left join BookingDays bd 
      on t.ID = bd.TeacherID and 
       bd.BookingDate = d.BookingDate 
     left join BookingDurations bds 
      on bd.BookingDuration = bds.ID 
     left join TeacherBands tb on t.Band = tb.ID 
     WHERE t.Active = 0 and (t.Status = 0 or t.Status = 1) and (bd.Status = 0 or bd.Status IS NULL) and PrimarySchool = 1 
     GROUP BY Firstname, Surname, t.Telephone, t.Mobile, t.Notes, tb.Band, t.ID, t.Teacher, t.TeacherAssistant, t.PrimarySchool, t.SecondarySchool, t.Nursery, t.Reception, t.Year1, t.Year2, t.Year3, t.Year4, t.Year5, t.Year6, t.Year7, t.Year8, t.Year9, t.Year10, t.Year11, t.ALevel 
     ORDER BY Surname, Firstname ASC 

表列:

ID | Firstname | Surname | Band | Telephone | Mobile | Teacher | Teacher Assistant | PrimarySchool | SecondarySchool | KeyStage | Mon | Tues | Wed | Thurs | Fri | Notes 

謝謝,馬特

+0

該代碼看起來不完整先生,代碼顯示「XXX」只存在對於星期四... – Raad 2013-02-14 15:20:46

+0

不確定你的意思,那是完整的代碼,它運行良好?只是沒有顯示週一到週五需要什麼。週四僅顯示xxx的代碼僅在週四發佈。我正在測試星期四專欄。一旦我對它進行了整理,我會在其他日子複製修復程序。 – dynamicuser 2013-02-14 15:22:17

+0

好吧,我看你做了什麼 - 第一行的縮進看起來很奇怪。 – Raad 2013-02-14 15:23:57

回答

4

我認爲問題在於你想要在需要分開的同時執行兩項操作(查看工作日,並檢查預訂時間)。爲此,我假設您的預訂時間爲:

  • 0 - PM
  • 1 - AM
  • 2 - 全日

如果這是不正確的,你需要來調整我的查詢slighlty,但是這應該讓你在正確的軌道上。我也認爲在預訂表中沒有記錄意味着不可用:

SET LANGUAGE British; 

WITH Bookings AS 
( SELECT BookingDays.TeacherID, 
      [WeekDay] = DATENAME(WEEKDAY, BookingDate), 
      [Status] = CASE WHEN BookingDuration = 0 THEN 'PM' WHEN BookingDuration = 1 THEN 'AM' ELSE 'Full Day' END 
    FROM BookingDays 
), PivotedBookings AS 
( SELECT * 
    FROM Bookings 
      PIVOT 
      ( MAX([Status]) 
       FOR [WeekDay] IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday]) 
      ) pvt 
) 
SELECT t.ID, 
     t.Firstname, 
     t.Surname, 
     tb.Band, 
     t.Telephone, 
     t.Mobile, 
     t.Teacher, 
     t.TeacherAssistant, 
     t.PrimarySchool, 
     t.SecondarySchool, 
     Monday = COALESCE(pb.Monday, 'Not Available'), 
     Tuesday = COALESCE(pb.Tuesday, 'Not Available'), 
     Wednesday = COALESCE(pb.Wednesday, 'Not Available'), 
     Thursday = COALESCE(pb.Thursday, 'Not Available'), 
     Friday = COALESCE(pb.Friday, 'Not Available'), 
     t.Notes 
FROM Teachers t 
     LEFT JOIN PivotedBookings pb 
      ON pb.TeacherID = t.ID 
     LEFT JOIN TeacherBands tb 
      ON tb.ID = t.Band; 

Cut down example on SQL Fiddle


附錄

看了這條線:

WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 2 or (bd.BookingDuration = 1 and bd.BookingDuration = 0) 

它使我相信有兩種可能的全天,無論是預約時間的2分鐘,還是同一位老師和日期在表格中的AM和PM條目。在這種情況下,有必要兩次透視數據,所以你的第一個CTE變爲:

WITH Bookings AS 
( SELECT BookingDays.TeacherID, 
      [WeekDay] = DATENAME(WEEKDAY, BookingDate), 
      [Status] = CASE WHEN [2] > 0 THEN 'Full Day' 
          WHEN [0] > 0 AND [1] > 0 THEN 'xxx' 
          WHEN [0] > 0 THEN 'PM' 
          WHEN [1] > 0 THEN 'AM' 
         END 

    FROM ( SELECT TeacherID, BookingDate, BookingDuration, [X] = 1 
       FROM BookingDays 
      ) BookingDays 
      PIVOT 
      ( SUM(X) 
       FOR BookingDuration IN ([0], [1], [2]) 
      ) pvt 
) 

Updated example on SQL Fiddle (Note Thursday for Teacher 1)

+0

謝謝,它可以直接使用,但是我仍然有同樣的問題,使同一天的同一位老師的AM和PM顯示爲'xxx'。我和這個人一起玩,看看我能做什麼。謝謝! :) – dynamicuser 2013-02-14 16:29:00

+0

我發佈後意識到這一點,忍受我的工作,我正在編輯應該解決您的問題。 – GarethD 2013-02-14 16:44:13

+0

哇,現貨!只有我添加的是WHERE語句才能獲得本週的預訂 - WHERE BookingDate> = DATEADD(ww,DATEDIFF(ww,0,GETDATE()),0)和BookingDate <= DATEADD(ww,DATEDIFF(ww ,0,GETDATE()),6)。感謝所有人的幫助! – dynamicuser 2013-02-18 11:21:01