SSRS中对Varchar类型Engaged Hour列按指定规则排序的问题
解决Varchar类型时段列的自定义排序问题
要实现先显示AM时段、再显示PM时段,且同一时段内按小时数值排序的需求,可以通过提取时段标识和转换小时为数值作为排序键来实现,以下是主流数据库的具体实现:
MySQL 实现
SELECT `Engaged Hour` FROM your_view ORDER BY -- 优先按AM/PM排序,AM在前 CASE RIGHT(`Engaged Hour`, 2) WHEN 'AM' THEN 0 ELSE 1 END, -- 按小时数值排序,修正字典序的问题 CAST(LEFT(`Engaged Hour`, LENGTH(`Engaged Hour`) - 2) AS UNSIGNED);
SQL Server 实现
SELECT [Engaged Hour] FROM your_view ORDER BY CASE RIGHT([Engaged Hour], 2) WHEN 'AM' THEN 0 ELSE 1 END, CAST(LEFT([Engaged Hour], LEN([Engaged Hour]) - 2) AS INT);
Oracle 实现
SELECT "Engaged Hour" FROM your_view ORDER BY CASE SUBSTR("Engaged Hour", -2) WHEN 'AM' THEN 0 ELSE 1 END, TO_NUMBER(SUBSTR("Engaged Hour", 1, LENGTH("Engaged Hour") - 2));
逻辑说明
- 时段优先级:通过
CASE语句将AM映射为0、PM映射为1,确保AM时段的行全部排在PM之前。 - 小时数值排序:提取
Engaged Hour中的数字部分并转换为数值类型,避免字符串字典序排序导致的1AM排在10AM之后的问题(如果确实需要按字符串字典序排序,可去掉数值转换,直接用提取的字符串作为第二排序键)。
内容的提问来源于stack exchange,提问作者Thanu
相关产品推荐
相关产品推荐

