如何在SQL中对简单两列表执行行转列(Pivot)操作?
用SQL实现行转列(Pivot)解决你的需求
当然可以用SQL搞定这个行转列的需求!你遇到的问题其实是典型的**行转列(Pivot)**场景,之前ETL工具得到带null的结果,是因为它只是把每行拆成了单独的列但没有做聚合合并,用SQL的专门语法或者条件聚合就能完美解决。
先明确你的原表数据:
List Count ---- ----- Bugs 3 Changes 5
方案1:支持PIVOT语法的数据库(SQL Server、Oracle、PostgreSQL 11+等)
这类数据库有原生的PIVOT关键字,写法很直观:
SELECT * FROM your_table -- 替换成你的实际表名 PIVOT ( MAX(Count) -- 因为每个List对应唯一的Count,用MAX/MIN/SUM都可以 FOR List IN (Bugs, Changes) -- 指定要转成列的List值 ) AS pivoted_result;
这里的MAX(Count)是用来聚合的,因为PIVOT需要一个聚合函数——由于每个List值只对应一个Count,所以用MAX、MIN甚至SUM都能拿到正确的数值,最终会把两行数据合并成一行。
方案2:不支持PIVOT的数据库(MySQL、老版本PostgreSQL等)
用条件聚合的通用写法,所有SQL数据库都支持:
SELECT MAX(CASE WHEN List = 'Bugs' THEN Count END) AS Bugs, MAX(CASE WHEN List = 'Changes' THEN Count END) AS Changes FROM your_table;
原理很简单:CASE语句会把对应List的Count值筛选出来,其他行对应位置是null,再用MAX聚合就会自动忽略null,把有效数值合并到同一行。
最终结果
不管用哪种方案,执行后都会得到你想要的结构:
Bugs Changes ---- ----- 3 5
如果以后你的List会新增动态值(比如新增Features之类的类别),可以考虑用动态SQL来自动生成列,但如果是固定的几个类别,上面的写法就完全够用啦。
内容的提问来源于stack exchange,提问作者Bob Duncan




