如何将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;
逻辑解释
- 第一子查询:通过
DISTINCT去重获取每个唯一的Numbers值,转换为字符串类型(保证与Letters类型一致,避免UNION类型不匹配错误),标记SortOrder=1确保它在同组Letters行之前。 - 第二子查询:获取所有
Letters值,标记SortOrder=2,归到对应的Numbers分组。 - 外层排序:先按
SortGroup(原Numbers值)升序,再按SortOrder保证Numbers行优先,最后对Newcol升序排序,确保Letters值有序。
适用场景
该方案适用于SQL Server、MySQL、PostgreSQL等主流关系型数据库,仅需根据数据库类型微调类型转换语法(比如MySQL用CONVERT(numbers, CHAR(10))替代CAST)。
内容的提问来源于stack exchange,提问作者AreJay
相关产品推荐
相关产品推荐

