如何在SQL中将表a转换为表b?实现行转列变换
SQL实现行转列(将Channel类别转为Score值列)
通用方案(适用于所有SQL数据库)
这种方法兼容性拉满,不管用MySQL、PostgreSQL、SQL Server还是Oracle都能跑:
SELECT Name, MAX(CASE WHEN Channel = 'Web' THEN score ELSE NULL END) AS Web, MAX(CASE WHEN Channel = 'App' THEN score ELSE NULL END) AS App FROM a GROUP BY Name;
逻辑很简单:先通过CASE WHEN判断每条记录的Channel值,匹配对应类别时取出score,否则返回NULL;再用GROUP BY Name把同一用户的记录合并,MAX(换成SUM或MIN也可以,因为每个用户每个渠道只有一条数据)会自动提取非空的score值,最终转出目标结构。
特定数据库简化方案(以SQL Server/Oracle为例)
如果你的数据库支持PIVOT函数,可以用更简洁的写法:
SELECT Name, Web, App FROM a PIVOT ( MAX(score) FOR Channel IN ([Web], [App]) ) AS PivotTable;
PIVOT是专门的行转列函数,指定聚合字段(score)、要转成列的字段(Channel),以及要生成的列名([Web]、[App]),直接输出结果。
内容的提问来源于stack exchange,提问作者kinguuu
相关产品推荐
相关产品推荐

