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 OrdersGROUP BY customerId;
运行以上代码,输出结果如下:
CUSTOMERID ORDERDATES
1 01-JAN-2021,02-JAN-20212 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 StudentUNPIVOT (
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 801 Course 102 90
1 Course 103 852 Course 102 95
2 Course 103 752 Course 104 85
以上代码中,我们使用UNPIVOT函数将Student表的数据根据studentId进行分组,然后将每个学生的课程成绩分成多行数据,输出结果中的Course 101、Course 102、Course 103和Course 104分别代表了课程id为101、102、103和104的成绩。
综上所述,Oracle的PIVOT和UNPIVOT函数提供了非常好用的数据转换功能。无论是将多行数据转为1列数据,还是将1列数据转为多行数据,都可以使用这两个函数来轻松实现。