Oracle中如何实现行列转换(oracle中行列装换)

Oracle中如何实现行列转换

在Oracle中,有时需要将某个表的行转换为列,或者将列转换为行。这种转换可以利用Oracle的PIVOT和UNPIVOT函数来实现。本文将介绍Pivot和Unpivot函数的用法,并通过示例代码演示如何进行行列转换。

1. Pivot函数

Pivot函数可以将行转换为列,它是Oracle 11g版本中新增的函数。其语法如下:

SELECT *
FROM (SELECT col1, col2, col3
FROM table1)
PIVOT (MAX(col2)
FOR col1
IN (‘val1’ AS alias1, ‘val2’ AS alias2, ‘val3’ AS alias3))

其中,col1、col2和col3是原始表的列名;val1、val2和val3是将要转换的值;alias1、alias2和alias3是转换后列的别名。

下面是一个示例代码,演示如何使用Pivot函数将表的行转换为列:

CREATE TABLE table1 (id NUMBER, category VARCHAR2(20), amount NUMBER);

INSERT INTO table1 VALUES (1, ‘A’, 100);
INSERT INTO table1 VALUES (1, ‘B’, 200);
INSERT INTO table1 VALUES (2, ‘A’, 150);
INSERT INTO table1 VALUES (2, ‘B’, 250);

SELECT *
FROM (SELECT category, id, amount
FROM table1)
PIVOT (SUM(amount)
FOR category
IN (‘A’ AS a_sum, ‘B’ AS b_sum));

该示例代码执行结果如下所示:

ID    A_SUM    B_SUM
-- ----- ------
1 100 200
2 150 250

2. Unpivot函数

Unpivot函数可以将列转换为行,它和Pivot函数恰好相反。其语法如下:

SELECT *
FROM (SELECT *
FROM table1
UNPIVOT INCLUDE NULLS
(amount FOR category IN (‘A’, ‘B’)));

其中,amount和category是要转换的列名,而‘A’和‘B’是这两列的值。

下面是一个示例代码,演示如何使用Unpivot函数将表的列转换为行:

CREATE TABLE table2 (id NUMBER, a_sum NUMBER, b_sum NUMBER);

INSERT INTO table2 VALUES (1, 100, 200);
INSERT INTO table2 VALUES (2, 150, 250);

SELECT id, category, amount
FROM (SELECT *
FROM table2
UNPIVOT INCLUDE NULLS
(amount FOR category IN (a_sum, b_sum)));

该示例代码执行结果如下所示:

ID    CATEGORY    AMOUNT
-- -------- ------
1 A_SUM 100
1 B_SUM 200
2 A_SUM 150
2 B_SUM 250

总结:

通过Pivot和Unpivot函数可以方便地实现表的行列转换。需要注意的是,在使用Pivot函数时,需要指定转换后列的别名,而在使用Unpivot函数时,需要指定要转换的列名。同时,在使用Pivot和Unpivot函数时,还需要注意数据类型的匹配问题,否则会出现转换失败或转换结果不符合预期的问题。


数据运维技术 » Oracle中如何实现行列转换(oracle中行列装换)