2014-06-25 51 views
0

我有一個查詢,列出了一週中所有日子的工作時間表和半小時增量的時間。對行進行排序通過在TSQL中首先保留具有特定值的行

SELECT ID,  
CallCenterScheduleID As WorkScheduleID,  
C.DayOfWeekID,  
C.TimeOfDayID, 
T.DisplayValue TimeDisplayName, 
W.DayOfWeekName WeekDisplayName 

FROM tblCallCenterCapacityDetail C 

INNER JOIN tblWeekDay W 
ON C.DayOfWeekID = W.DayOfWeekID 

INNER JOIN tblTimeOfDay T 
ON C.TimeOfDayID = T.TimeOfDayID 

WHERE CallCenterScheduleID = 75 

ORDER BY 
    CASE 
     WHEN C.DayOfWeekID = 6 AND T.DisplayValue = '2:30 PM' THEN 0 
     ELSE 1 
    END ASC 

上面的查詢提出了這樣的結果

enter image description here

要求:

  1. WeekDisplayName有48條記錄的每一天,就像你看到週三,你首先看到的前19條記錄,其餘記錄出現在結果的最後。我需要將一天中的所有48條記錄放在一起,然後在隨後的每一天中記錄48條記錄。

  2. 星期三之後,星期四的第一個記錄有時間上午12:00,我需要顯示與星期三選擇的時間相同的時間。正如你所看到的,星期三的第一條記錄在下午2點30分有時間,但是與星期四相關的第20條行首先顯示中午12點。 我需要爲每週的每一天顯示下午2:30的時間。

+0

我很困惑。你希望每一天的所有48行彼此相鄰,但是時間從下午2:30開始。所以我的問題就在你的例子中,星期三下午11:30後的下一行應該是什麼?下午1:30應該去哪裏? – SQLChao

+0

晚上11點30分之後,我們需要在上午230點之前顯示跳過第三天的記錄 – suleman

回答

0

上述問題的可能解決方案是根據時間對記錄進行分區,然後根據首選日的值進行排序。

以下查詢的竅門。

SELECT ID,  
CallCenterScheduleID,  
C.DayOfWeekID,  
C.TimeOfDayID, 
T.DisplayValue TimeDisplayName, 
W.DayOfWeekName WeekDisplayName, 
row_number() 
    OVER(
     partition by C.DayOfWeekID 
     ORDER BY 
     CASE 
      WHEN 
       T.DisplayValue = '2:30 PM' 
      THEN 0 
      ELSE 1 
     END ASC 
    ) AS ROWNUM 

FROM tblCallCenterCapacityDetail C 

INNER JOIN tblWeekDay W 
ON C.DayOfWeekID = W.DayOfWeekID 

INNER JOIN tblTimeOfDay T 
ON C.TimeOfDayID = T.TimeOfDayID 

WHERE CallCenterScheduleID = 75 

ORDER BY 
    CASE 
     WHEN 
      C.DayOfWeekID = 1 

     THEN 0 

     ELSE 1 
    END ASC 

由於每天有48條記錄,所以每天記錄被組合在一起,並設定2:30 PM爲每一天的第一條記錄。

enter image description here

相關問題