In case of two THEN conditions of the CASE statement reference expressions of different data types. In this case, SQL Server implicitly converts the data type for the entire CASE expression to the data type in the THEN clause that has the highest order of data-type precedence. (See the SQL Server Books Online (BOL) topic “Data Type Precedence.”)
BEFORE:
declare @SortExpression varchar(20)
set @SortExpression =‘OverSpeed’
SELECT Journey_Id,
Drv_ID,
Journey_Start_Dt AS ‘StartDateTime’,
Journey_End_Dt AS ‘EndDateTime’,
Journey_Time_Sec AS ‘TotalTime’,
Journey_Dest_Miles AS ‘TotalDistance’,
Max_Speed_Mph AS ‘MAXSpeed’,
Brake_Flg AS ‘AggDriving’,
OverSpeed_Flg AS ‘OverSpeed’
FROM DRIVER_JOURNEY_INFO AS td
WHERE (Company_Id = 9003) AND (Drv_ID = 2017) AND (Journey_Start_Dt BETWEEN ’08/01/2008′ AND ’09/30/2008′) AND
(Journey_End_Dt BETWEEN ’08/01/2008′ AND ’09/30/2008′)
ORDER BY
CASE
WHEN @SortExpression = ‘Journey_Id’ THEN Journey_Id
WHEN @SortExpression = ‘StartDateTime’ THEN Journey_Start_Dt
WHEN @SortExpression = ‘EndDateTime’ THEN Journey_End_Dt
WHEN @SortExpression = ‘TotalTime’ THEN Journey_Time_Sec
WHEN @SortExpression = ‘TotalDistance’ THEN Journey_Dest_Miles
WHEN @SortExpression = ‘MAXSpeed’ THEN Max_Speed_Mph
WHEN @SortExpression = ‘AggDriving’ THEN Brake_Flg
WHEN @SortExpression = ‘OverSpeed’ THEN OverSpeed_Flg
ELSE Journey_Id
END
DESC
CORRECTED:
ORDER BY
CASE
WHEN @SortExpression = ‘Journey_Id’ THEN Journey_Id
WHEN @SortExpression = ‘StartDateTime’ THEN Journey_Start_Dt
WHEN @SortExpression = ‘EndDateTime’ THEN Journey_End_Dt
WHEN @SortExpression = ‘TotalTime’ THEN Journey_Time_Sec
WHEN @SortExpression = ‘TotalDistance’ THEN Journey_Dest_Miles WHEN @SortExpression = ‘MAXSpeed’ THEN Max_Speed_Mph
WHEN @SortExpression = ‘TAII’ THEN (CAST(TAI_Time_Sec AS DECIMAL(18,2))/Journey_Time_Sec)*10
WHEN @SortExpression = ‘TIP’ THEN (CAST(TI_Time_Sec AS DECIMAL(18,2))/Journey_Time_Sec)*100
WHEN @SortExpression = ” THEN Journey_Id
END
DESC,
CASE WHEN @SortExpression = ‘AggDriving’ THEN Brake_Flg END DESC,
CASE WHEN @SortExpression = ‘OverSpeed’ THEN OverSpeed_Flg END DESC

