You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; -- 按原表顺序输出

关键细节说明

  1. UNPIVOT修正:你原来的Col FOR Val IN写反了,正确语法是Val FOR Col IN,我们需要把n1-n6的数值放到Val列,原列名放到Col列。
  2. CTE2排序:用ROW_NUMBER()按id分区,保证每个行内的数值单独排序,生成的OrderedVals就是每行内数值的升序序号。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:21:39