oracle 列转行- 使用 UNPIVOT

发布时间 2023-09-07 15:28:46作者: 雨涅

在 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]`:要转换为行的源列列表。