如何在SQL中无需aggregation函数实现表的PIVOT转置?
解决PIVOT转置表无需聚合的问题
你的核心困惑是觉得PIVOT必须用聚合函数,但你的数据场景其实完全可以用聚合函数实现需求——问题出在你之前的写法有误,而非聚合函数本身不合适。
你的源数据中,每个国家(COUNTRY)和级别(LEVEL)的组合是唯一的,这意味着用MAX()或MIN()聚合时,每个分组只会返回唯一的那个数值,不会导致空值。
方法1:用PIVOT语法(适用于SQL Server、Oracle等支持PIVOT的数据库)
SELECT COUNTRY, High, Medium, Low FROM ( -- 先取出需要转置的核心列 SELECT COUNTRY, LEVEL, NUMBER FROM 你的表名 ) AS SourceData PIVOT ( MAX(NUMBER) -- 用MAX/MIN均可,因为每个组仅一个值 FOR LEVEL IN (High, Medium, Low) -- 指定要转成列的LEVEL值 ) AS PivotedTable;
方法2:条件聚合(通用所有SQL数据库,比PIVOT更灵活)
如果你的数据库不支持PIVOT(比如MySQL),可以用条件聚合实现同样效果:
SELECT COUNTRY, MAX(CASE WHEN LEVEL = 'High' THEN NUMBER END) AS High, MAX(CASE WHEN LEVEL = 'Medium' THEN NUMBER END) AS Medium, MAX(CASE WHEN LEVEL = 'Low' THEN NUMBER END) AS Low FROM 你的表名 GROUP BY COUNTRY;
这两种写法都会输出你期望的结果,不会出现空值——因为每个CASE语句在对应级别下只会返回唯一的NUMBER值,聚合函数只是把这个值保留下来,没有实际的"聚合"操作。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

