Oracle学习将1列数据转换为多行数据(oracle 1列转多行)

Oracle学习:将1列数据转换为多行数据

在Oracle数据库中,有时候会有将一列数据转换为多行数据的需求。这种情况下,我们可以使用Oracle的PIVOT函数或者UNPIVOT函数来实现。

1. 将多行数据转换为1列数据

我们来看一下如何将多行数据转换为1列数据。例如,我们有一个Orders表,其中包含了客户id,订单id和订单日期,如下所示:

CREATE TABLE Orders (
customerId NUMBER,
orderId NUMBER,
orderDate DATE
);

INSERT INTO Orders VALUES (1, 101, TO_DATE('01-01-2021', 'DD-MM-YYYY'));
INSERT INTO Orders VALUES (1, 102, TO_DATE('02-01-2021', 'DD-MM-YYYY'));
INSERT INTO Orders VALUES (2, 103, TO_DATE('03-01-2021', 'DD-MM-YYYY'));
INSERT INTO Orders VALUES (2, 104, TO_DATE('04-01-2021', 'DD-MM-YYYY'));
INSERT INTO Orders VALUES (3, 105, TO_DATE('05-01-2021', 'DD-MM-YYYY'));

现在,我们希望将这些订单数据按照客户id进行分组,并将每个客户的订单日期合并成一条记录。我们可以使用Oracle的LISTAGG函数来实现:

SELECT customerId, LISTAGG(orderDate, ',') WITHIN GROUP (ORDER BY orderDate) AS orderDates
FROM Orders
GROUP BY customerId;

运行以上代码,输出结果如下:

CUSTOMERID  ORDERDATES
1 01-JAN-2021,02-JAN-2021
2 03-JAN-2021,04-JAN-2021
3 05-JAN-2021

以上代码将Orders表的数据根据customerId进行分组,然后使用LISTAGG函数将每个客户的订单日期合并成一条记录。

2. 将1列数据转换为多行数据

现在,假设我们有一个Student表,其中包含了学生id,课程id和成绩。我们希望将这些成绩数据按照学生id进行分组,并将每个学生的课程成绩分成多行数据,如下所示:

CREATE TABLE Student (
studentId NUMBER,
courseId NUMBER,
grade NUMBER
);

INSERT INTO Student VALUES (1, 101, 80);
INSERT INTO Student VALUES (1, 102, 90);
INSERT INTO Student VALUES (1, 103, 85);
INSERT INTO Student VALUES (2, 102, 95);
INSERT INTO Student VALUES (2, 103, 75);
INSERT INTO Student VALUES (2, 104, 85);

现在,我们可以使用Oracle的UNPIVOT函数来实现将1列数据转换为多行数据的目标。具体代码如下:

SELECT studentId, courseId, grade
FROM Student
UNPIVOT (
grade FOR (courseId) IN (
(101) AS 'Course 101',
(102) AS 'Course 102',
(103) AS 'Course 103',
(104) AS 'Course 104'
)
);

运行以上代码,输出结果如下:

STUDENTID   COURSEID    GRADE
1 Course 101 80
1 Course 102 90
1 Course 103 85
2 Course 102 95
2 Course 103 75
2 Course 104 85

以上代码中,我们使用UNPIVOT函数将Student表的数据根据studentId进行分组,然后将每个学生的课程成绩分成多行数据,输出结果中的Course 101、Course 102、Course 103和Course 104分别代表了课程id为101、102、103和104的成绩。

综上所述,Oracle的PIVOT和UNPIVOT函数提供了非常好用的数据转换功能。无论是将多行数据转为1列数据,还是将1列数据转为多行数据,都可以使用这两个函数来轻松实现。


数据运维技术 » Oracle学习将1列数据转换为多行数据(oracle 1列转多行)