You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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语句会把对应ListCount值筛选出来,其他行对应位置是null,再用MAX聚合就会自动忽略null,把有效数值合并到同一行。

最终结果

不管用哪种方案,执行后都会得到你想要的结构:

Bugs    Changes
----    -----
3       5

如果以后你的List会新增动态值(比如新增Features之类的类别),可以考虑用动态SQL来自动生成列,但如果是固定的几个类别,上面的写法就完全够用啦。

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

火山引擎 最新活动