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

如何将SQL表多列数据转为单列并按指定顺序排序?

如何将SQL两列数据按指定顺序合并为单列?

需求说明

现有未排序的两列表T1(Numbers列、Letters列),需将两列数据提取至单列Newcol,输出规则如下:

  • 整体按Numbers列升序排序
  • 每个Numbers值单独占一行,排在其对应的所有Letters值之前
  • 同一Numbers对应的Letters值按升序排列

测试数据

INSERT INTO T1 
  (numbers, letters)
  VALUES 
  ('1', '1A'),
  ('1', '1B'),
  ('1', '1C'),
  (3, '3B'),
  (1, '3C'),
  (3, '3D'),
  (2, '2A'),
  (4, '2B'),
  (7, '2C'),
  (3, '3A')
;

问题分析

你之前的CTE查询仅对原表排序后同时输出两列,并未实现两列合并为单列,也没控制Numbers行优先于对应Letters行的顺序。

解决方案

使用UNION ALL合并两组数据,通过排序标识控制行的优先级,最终按规则排序:

SELECT Newcol
FROM (
    -- 提取唯一Numbers值作为每组首行,优先级最高
    SELECT DISTINCT 
        CAST(numbers AS VARCHAR(10)) AS Newcol,
        numbers AS SortGroup,
        1 AS SortOrder
    FROM T1
    UNION ALL
    -- 提取所有Letters值,归到对应Numbers组,优先级次之
    SELECT 
        letters AS Newcol,
        numbers AS SortGroup,
        2 AS SortOrder
    FROM T1
) AS Combined
-- 排序逻辑:先按Numbers组排序,再按优先级,最后Letters升序
ORDER BY 
    SortGroup,
    SortOrder,
    Newcol;

逻辑解释

  1. 第一子查询:通过DISTINCT去重获取每个唯一的Numbers值,转换为字符串类型(保证与Letters类型一致,避免UNION类型不匹配错误),标记SortOrder=1确保它在同组Letters行之前。
  2. 第二子查询:获取所有Letters值,标记SortOrder=2,归到对应的Numbers分组。
  3. 外层排序:先按SortGroup(原Numbers值)升序,再按SortOrder保证Numbers行优先,最后对Newcol升序排序,确保Letters值有序。

适用场景

该方案适用于SQL Server、MySQL、PostgreSQL等主流关系型数据库,仅需根据数据库类型微调类型转换语法(比如MySQL用CONVERT(numbers, CHAR(10))替代CAST)。

内容的提问来源于stack exchange,提问作者AreJay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:20:22