SQL分组并将非分组行转为列的实现方案求助
SQL行转列实现方案
原数据
| AreaId | AreaName | Module |
|---|---|---|
| 1 | AAA | Square |
| 2 | AAA | Circle |
| 3 | BBB | Square |
| 4 | CCC | Square |
| 5 | CCC | Circle |
| 6 | DDD | Circle |
目标格式
| AreaName | SquareArea | CircleArea |
|---|---|---|
| AAA | 1 | 2 |
| BBB | 3 | Null |
| CCC | 4 | 5 |
| DDD | Null | 6 |
解决方案SQL
使用CASE WHEN结合分组聚合即可实现需求,无需DISTINCT:
SELECT AreaName, MAX(CASE WHEN Module = 'Square' THEN AreaId END) AS SquareArea, MAX(CASE WHEN Module = 'Circle' THEN AreaId END) AS CircleArea FROM 你的表名 -- 替换成实际表名 GROUP BY AreaName;
逻辑说明
CASE WHEN根据Module的值匹配提取对应的AreaId,不匹配的会返回NULLMAX()聚合函数配合GROUP BY AreaName,将同一个AreaName的多条记录合并为一行,自动保留对应Module的AreaId值,无对应值的则显示NULL
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

