如何在Oracle中将多行数据进行行转列处理
解决方案:将行转固定列的SQL实现
原数据表
| date | user | id | count |
|---|---|---|---|
| 11MAR23 | a1 | 10 | 1024 |
| 11MAR23 | a1 | 20 | 510 |
| 11MAR23 | a1 | 40 | 788 |
| 11MAR23 | a2 | 20 | 300 |
| 12MAR23 | a1 | 30 | 400 |
期望结果表
| date | user | id10 | id20 | id30 | id40 |
|---|---|---|---|---|---|
| 11MAR23 | a1 | 1024 | 510 | 788 | |
| 11MAR23 | a2 | 300 | |||
| 12MAR23 | a1 | 400 |
解决方法:条件聚合
你之前用分区(partitioning)的问题在于,开窗函数仅给每行添加计算结果,不会合并行。要实现行转固定列并合并同一date+user的行,需要用GROUP BY结合条件聚合:
SELECT date, user, MAX(CASE WHEN id = 10 THEN count END) AS id10, MAX(CASE WHEN id = 20 THEN count END) AS id20, MAX(CASE WHEN id = 30 THEN count END) AS id30, MAX(CASE WHEN id = 40 THEN count END) AS id40 FROM your_table_name GROUP BY date, user ORDER BY date, user;
原理说明
- GROUP BY date, user:将相同日期和用户的行合并为一行
- MAX(CASE ...):对每个目标id值,筛选出对应的count;由于每个
date+user+id组合仅对应一个count值,MAX会自动忽略空值,保留唯一有效数值 - 目标列固定,直接为每个预设id编写对应的CASE语句即可
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

