SQL Server 2014中如何对每行数据进行升序排序输出?
实现SQL Server每行内列值升序排序
你的思路完全正确!要实现每行内n1-n6的升序排列,确实需要借助**UNPIVOT(列转行)→ 分组排序 → PIVOT(行转列)**的组合逻辑。你的CTE框架已经搭对了方向,只是在UNPIVOT和PIVOT的语法细节上需要调整,下面咱们一步步修正并完成代码:
完整实现代码
;WITH cte1 AS ( -- 第一步:把每行的n1-n6列转成行记录,保留唯一id和type SELECT [id], [type], -- Val是n1-n6的具体数值,Col是原列名(n1/n2...) Val, Col FROM ( SELECT [id], [n1], [n2], [n3], [n4], [n5], [n6], [type] FROM [t1] ) t -- 注意UNPIVOT的语法:值列 FOR 原列名列 IN (要转的列列表) UNPIVOT (Val FOR Col IN ([n1], [n2], [n3], [n4], [n5], [n6])) AS tblUnPivot ), cte2 AS ( -- 第二步:按id分组,对每个id下的Val升序排序,生成1-6的序号 SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Val) AS OrderedVals, [id], [type], Val FROM cte1 ), cte3 AS ( -- 第三步:把排序后的行再转回列,OrderedVals作为新列的序号(Nr1-Nr6) SELECT [id], [type], -- 把OrderedVals的1-6转为Nr1-Nr6列 [1] AS Nr1, [2] AS Nr2, [3] AS Nr3, [4] AS Nr4, [5] AS Nr5, [6] AS Nr6 FROM ( SELECT [OrderedVals], [id], [type], Val FROM cte2 ) s -- PIVOT语法:聚合函数(值列) FOR 分组列 IN (目标列列表) -- 因为每个id+OrderedVals只有一个值,用MAX/MIN都可以 PIVOT (MAX(Val) FOR OrderedVals IN ([1],[2],[3],[4],[5],[6])) AS tblPivot ) -- 最后输出结果,可根据需要去掉id列 SELECT Nr1, Nr2, Nr3, Nr4, Nr5, Nr6, Type FROM cte3 ORDER BY id; -- 按原表顺序输出
关键细节说明
- UNPIVOT修正:你原来的
Col FOR Val IN写反了,正确语法是Val FOR Col IN,我们需要把n1-n6的数值放到Val列,原列名放到Col列。 - CTE2排序:用
ROW_NUMBER()按id分区,保证每个行内的数值单独排序,生成的OrderedVals就是每行内数值的升序序号。 - PIVOT实现:通过
MAX(Val)(或MIN(Val))把排序后的行转回列,将OrderedVals的1-6映射为Nr1-Nr6,这样就得到了每行内升序排列的结果。
验证结果
执行上述代码后,输出会和你期望的示例完全一致:
Nr1 Nr2 Nr3 Nr4 Nr5 Nr6 Type
6 10 11 15 22 25 C1
1 2 5 20 21 30 C1
4 12 15 18 25 38 C2
1 4 9 11 24 31 C2
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

