排序行通过在SQL中首先保留具有特定值的行

时间:2014-06-25 16:19:16

标签: sql-server 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点,我需要显示与Wednesay一样的时间。正如您所看到的,周三显示的第一个记录在下午2:30有时间,但与周四相关的第20行显示的是上午12:00。 我需要每周下午2:30显示时间。

1 个答案:

答案 0 :(得分: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设置为第一条记录。

enter image description here