oracle 列转行- 使用 UNPIVOT
在 Oracle 数据库中,如果你想将一列的值转换为行,你可以使用 SQL 查询来实现这个目标。你可以使用 `PIVOT` 或 `UNPIVOT` 操作,具体取决于你想要实现的转换方向。
1、列转行 - 使用 UNPIVOT
UNPIVOT 操作用于将多列转换为多行。假设你有以下表格:
```sql
CREATE TABLE YourTable (
ID NUMBER,
Name VARCHAR2(50),
Score1 NUMBER,
Score2 NUMBER,
Score3 NUMBER
);
INSERT INTO YourTable (ID, Name, Score1, Score2, Score3)
VALUES (1, 'John', 85, 90, 78);
INSERT INTO YourTable (ID, Name, Score1, Score2, Score3)
VALUES (2, 'Jane', 92, 88, 95);
```
要将分数列转换为行,可以使用 UNPIVOT 操作:
```sql
SELECT ID, Name, ScoreType, Score
FROM YourTable
UNPIVOT (
Score FOR ScoreType IN (Score1, Score2, Score3)
);
```
这将返回以下结果:
```
ID | Name | ScoreType | Score
---|------|-----------|------
1 | John | SCORE1 | 85
1 | John | SCORE2 | 90
1 | John | SCORE3 | 78
2 | Jane | SCORE1 | 92
2 | Jane | SCORE2 | 88
2 | Jane | SCORE3 | 95
```
### 行转列 - 使用 PIVOT
如果你想将多行转换为多列,可以使用 PIVOT 操作。假设你有以下表格:
```sql
CREATE TABLE YourTable (
ID NUMBER,
ScoreType VARCHAR2(10),
Score NUMBER
);
INSERT INTO YourTable (ID, ScoreType, Score)
VALUES (1, 'SCORE1', 85);
INSERT INTO YourTable (ID, ScoreType, Score)
VALUES (1, 'SCORE2', 90);
INSERT INTO YourTable (ID, ScoreType, Score)
VALUES (1, 'SCORE3', 78);
INSERT INTO YourTable (ID, ScoreType, Score)
VALUES (2, 'SCORE1', 92);
INSERT INTO YourTable (ID, ScoreType, Score)
VALUES (2, 'SCORE2', 88);
INSERT INTO YourTable (ID, ScoreType, Score)
VALUES (2, 'SCORE3', 95);
```
要将分数行转换为列,可以使用 PIVOT 操作:
sql:
SELECT *
FROM YourTable
PIVOT (
MAX(Score) FOR ScoreType IN ('SCORE1' AS SCORE1, 'SCORE2' AS SCORE2, 'SCORE3' AS SCORE3)
);
这将返回以下结果:
ID | SCORE1 | SCORE2 | SCORE3
---|--------|--------|-------
1 | 85 | 90 | 78
2 | 92 | 88 | 95
2、UNPIVOT的用法
`UNPIVOT` 是用于将列数据转换为行数据的 SQL 操作。它可以用于将多列数据转换为一列,以便更容易进行数据分析和报告生成。以下是 `UNPIVOT` 的用法和示例。
假设你有以下的表格 `YourTable`:
sql
CREATE TABLE YourTable (
ID NUMBER,
Name VARCHAR2(50),
Score1 NUMBER,
Score2 NUMBER,
Score3 NUMBER
);
INSERT INTO YourTable (ID, Name, Score1, Score2, Score3)
VALUES (1, 'John', 85, 90, 78);
INSERT INTO YourTable (ID, Name, Score1, Score2, Score3)
VALUES (2, 'Jane', 92, 88, 95);
你可以使用 `UNPIVOT` 来将分数列(`Score1`、`Score2`、`Score3`)转换为行:
sql:
SELECT ID, Name, ScoreType, Score
FROM YourTable
UNPIVOT (
Score FOR ScoreType IN (Score1, Score2, Score3)
);
这将生成以下结果:
ID | Name | ScoreType | Score
---|------|-----------|------
1 | John | SCORE1 | 85
1 | John | SCORE2 | 90
1 | John | SCORE3 | 78
2 | Jane | SCORE1 | 92
2 | Jane | SCORE2 | 88
2 | Jane | SCORE3 | 95
在这个示例中,`UNPIVOT` 操作将 `Score1`、`Score2` 和 `Score3` 列转换为了 `ScoreType` 和 `Score` 列。
`UNPIVOT` 的基本语法如下:
sql:
SELECT [columns]
FROM [table]
UNPIVOT (
[output_column] FOR [pivot_column] IN ([source_columns])
);
- `[columns]`:你想要从表中选择的其他列。
- `[table]`:要执行 `UNPIVOT` 操作的表。
- `[output_column]`:生成的行中的列名称。
- `[pivot_column]`:用于标识原始列的列名称。
- `[source_columns]`:要转换为行的源列列表。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?