oracle行列转换
时间: 2023-07-26 09:14:48 浏览: 85
在Oracle中,可以使用PIVOT和UNPIVOT函数进行行列转换。
1. 行转列 (PIVOT)
PIVOT函数可以将行数据转换为列数据,可以使用聚合函数对数据进行汇总。
语法如下:
```
SELECT *
FROM table_name
PIVOT (
aggregate_function(column_name)
FOR pivot_column_name
IN (pivot_column_value1, pivot_column_value2, ...)
)
```
其中,aggregate_function是聚合函数,column_name是要进行聚合的列名,pivot_column_name是要进行转换的列名,pivot_column_value是要转换成的列名。
例如,假设您有如下表格:
```
ID Name Score
1 Tom 90
2 Jack 80
3 Mary 95
```
如果您想要将分数按照姓名进行转换,可以使用如下语句:
```
SELECT *
FROM (
SELECT Name, Score
FROM table_name
)
PIVOT (
AVG(Score)
FOR Name
IN ('Tom', 'Jack', 'Mary')
);
```
执行结果为:
```
'Mary_AVG(Score)' 'Jack_AVG(Score)' 'Tom_AVG(Score)'
----------------- ----------------- ----------------
95 80 90
```
其中,使用AVG函数对分数进行平均值计算,并且将Name列转换成了列标题。
2. 列转行 (UNPIVOT)
UNPIVOT函数可以将列数据转换为行数据。
语法如下:
```
SELECT *
FROM (
SELECT *
FROM table_name
UNPIVOT (
value_column
FOR unpivot_column
IN (column1, column2, ...)
)
)
WHERE value_column IS NOT NULL;
```
其中,value_column是转换后的值列名,unpivot_column是转换后的列名列名,column1, column2, ...是要进行转换的列名。
例如,假设您有如下表格:
```
ID Tom Jack Mary
1 90 80 95
2 80 85 90
```
如果您想要将分数按照姓名进行转换,可以使用如下语句:
```
SELECT ID, Name, Score
FROM (
SELECT *
FROM table_name
UNPIVOT (
Score
FOR Name
IN (Tom, Jack, Mary)
)
)
WHERE Score IS NOT NULL;
```
执行结果为:
```
ID Name Score
-- ---- -----
1 Tom 90
1 Jack 80
1 Mary 95
2 Tom 80
2 Jack 85
2 Mary 90
```
其中,UNPIVOT函数将Tom、Jack、Mary列转换成了Name列,并且将分数作为值列,最终得到了转换后的结果。
阅读全文