如何在SQL中将一列拆分为两列并合并两行?(附示例)
解决SQL中列拆分合并行的问题
你这个需求属于典型的行转列场景,就是把同一分组下不同行的字段值,转成同一行的不同列。我给你两种实用的实现方法:
原表格数据
| Sr.No | Field1 | Field2 | Field3 |
|---|---|---|---|
| 1. | ABC | abc@abc | HTML |
| 2. | ABC | efg@efg | XML |
期望输出
| Sr.No | Field1 | HTML | XML |
|---|---|---|---|
| 1. | ABC | abc@abc | efg@efg |
方法一:条件聚合(通用所有SQL数据库)
这种写法兼容性最好,不管你用MySQL、PostgreSQL、SQL Server还是Oracle都能跑:
SELECT MIN(Sr.No) AS Sr.No, -- 取同一分组里最小的序号,统一显示为1. Field1, -- 当Field3是HTML时,取对应的Field2值,否则返回NULL,用MAX提取有效数据 MAX(CASE WHEN Field3 = 'HTML' THEN Field2 END) AS HTML, -- 同理处理XML列 MAX(CASE WHEN Field3 = 'XML' THEN Field2 END) AS XML FROM your_table_name -- 把这里替换成你的实际表名 GROUP BY Field1; -- 按Field1分组,把同一Field1的行合并
代码解释
GROUP BY Field1:将Field1值相同的行归为一组,这里就是把两行ABC的记录合并成一组CASE WHEN:针对每组里的不同Field3值,提取对应的Field2内容,没有匹配的会返回NULLMAX():因为每组里每个CASE只会有一个非NULL值,用MAX(或MIN)可以把这个有效值筛选出来,作为新列的内容MIN(Sr.No):因为两行的序号不同,我们要统一显示为1.,取最小值就能得到目标结果
方法二:使用PIVOT函数(适用于SQL Server、Oracle等支持的数据库)
如果你的数据库支持PIVOT语法,可以用更简洁的写法:
SELECT Sr.No, Field1, HTML, XML FROM ( -- 先把需要的数据查出来作为源表 SELECT Sr.No, Field1, Field2, Field3 FROM your_table_name ) AS source_data PIVOT ( -- 对Field2做聚合,这里用MAX因为每组只有一个值 MAX(Field2) -- 指定要转成列的字段是Field3,列出需要的列值 FOR Field3 IN (HTML, XML) ) AS pivot_table;
代码解释
- 子查询
source_data:先获取需要的基础字段,作为PIVOT的数据源 PIVOT子句:指定对Field2进行聚合(这里用MAX即可),然后把Field3的不同值(HTML、XML)转成对应的列名,自动填充对应的值
两种方法都能得到你想要的结果,优先推荐条件聚合,因为兼容性更强~
内容的提问来源于stack exchange,提问作者Ankita Dharmik
相关产品推荐
相关产品推荐

