如何在SQL中对特定行查询返回的列值进行排序?
解决方案:调整查询返回列的数值顺序
要实现将MARKS_TABLE中Id='X'的记录返回时,让Sub1、Sub2、Sub3列的值按55、65、100的固定顺序排列,普通ORDER BY无法满足需求(它只能对行排序,不能调整列内值的顺序),可以通过「列转行→指定规则排序→行转列」的思路来实现:
实现SQL代码
SELECT Id, MAX(CASE WHEN rn = 1 THEN val END) AS Sub1, MAX(CASE WHEN rn = 2 THEN val END) AS Sub2, MAX(CASE WHEN rn = 3 THEN val END) AS Sub3 FROM ( -- 第一步:将Sub1/Sub2/Sub3列拆分为单独的行 SELECT Id, val, -- 第二步:按指定的数值顺序分配排序优先级 ROW_NUMBER() OVER (ORDER BY CASE val WHEN 55 THEN 1 WHEN 65 THEN 2 WHEN 100 THEN 3 ELSE 4 -- 其他数值排在最后 END) AS rn FROM MARKS_TABLE CROSS JOIN ( SELECT Sub1 AS val UNION ALL SELECT Sub2 UNION ALL SELECT Sub3 ) AS vals WHERE Id = 'X' ) AS sorted_vals -- 第三步:将排序后的行转回列 GROUP BY Id;
代码说明
- 列转行:通过
UNION ALL把Sub1、Sub2、Sub3三个列的数值拆成每行一个值,方便后续排序操作。 - 指定规则排序:用
CASE语句给目标数值分配排序优先级(55对应1,65对应2,100对应3),再通过ROW_NUMBER()给每行标记排序后的序号。 - 行转列:外层用
MAX(CASE...)根据序号把排序后的数值重新映射到Sub1、Sub2、Sub3列,最终得到按指定顺序排列的结果。
内容的提问来源于stack exchange,提问作者user1692342
相关产品推荐
相关产品推荐

