什么是横表和纵表
在oracle数据库中,表的结构通常是横向的,即每个列都是不同属性的数据。例如,一个订单表可能包含订单编号、客户名称、订单日期、订单状态等等。这种表称为横表。然而,在某些情况下,我们需要将数据以一种更方便的方式呈现,这时候就需要将横表转换成纵表。纵表将每个属性作为一条记录的一个字段,更适合于展示某个实体的多个属性值,例如商品、学生、考试成绩等等。
如何将横表转换成纵表
将横表转换成纵表需要借助于Oracle提供的PIVOT和UNPIVOT函数。
使用PIVOT函数将横表转换成纵表
使用PIVOT函数可以将横表转换成纵表。下面是一个例子:
CREATE TABLE SALES (
YEAR NUMBER,
QUARTER NUMBER,
PRODUCT VARCHAR2(50),
AMOUNT NUMBER
);
INSERT INTO SALES VALUES (2017, 1, 'Product A', 10000);
INSERT INTO SALES VALUES (2017, 1, 'Product B', 20000);
INSERT INTO SALES VALUES (2017, 2, 'Product A', 30000);
INSERT INTO SALES VALUES (2017, 2, 'Product B', 40000);
INSERT INTO SALES VALUES (2018, 1, 'Product A', 50000);
INSERT INTO SALES VALUES (2018, 1, 'Product B', 60000);
INSERT INTO SALES VALUES (2018, 2, 'Product A', 70000);
INSERT INTO SALES VALUES (2018, 2, 'Product B', 80000);
SELECT *
FROM (
SELECT YEAR, PRODUCT, AMOUNT
FROM SALES
)
PIVOT (
SUM(AMOUNT)
FOR YEAR IN (2017,2018)
);
这里,我们从SALES表中选取了YEAR、PRODUCT和AMOUNT列,然后对YEAR列使用PIVOT函数,将其转换成纵表形式,其中将2017和2018作为列来展示,在每一列中显示每个产品的销售总额。输出结果如下:
PRODUCT 2017 2018
Product A 40000 120000
Product B 60000 140000
这样就将横向的数据转换成了纵向展示。
使用UNPIVOT函数将纵表转换成横表
使用UNPIVOT函数可以将纵表转换成横表。下面是一个例子:
CREATE TABLE STUDENT_GRADES (
NAME VARCHAR2(50),
ENGLISH NUMBER,
MATH NUMBER,
SCIENCE NUMBER
);
INSERT INTO STUDENT_GRADES VALUES ('Tom', 85, 90, 93);
INSERT INTO STUDENT_GRADES VALUES ('Mary', 78, 88, 85);
INSERT INTO STUDENT_GRADES VALUES ('John', 92, 94, 91);
SELECT *
FROM (
SELECT NAME, SUBJECT, SCORE
FROM STUDENT_GRADES
UNPIVOT (
SCORE
FOR SUBJECT IN (ENGLISH, MATH, SCIENCE)
)
);
这里,我们从STUDENT_GRADES表中选取了NAME、ENGLISH、MATH和SCIENCE列,然后对ENGLISH、MATH和SCIENCE列使用UNPIVOT函数,将其转换成横表形式,其中每条记录表示每个学生的每个科目的成绩。输出结果如下:
NAME SUBJECT SCORE
Tom ENGLISH 85
Tom MATH 90
Tom SCIENCE 93
Mary ENGLISH 78
Mary MATH 88
Mary SCIENCE 85
John ENGLISH 92
John MATH 94
John SCIENCE 91
这样就将纵向展示的数据转换成了横向的表格。
总结
在Oracle数据库中,我们可以使用PIVOT和UNPIVOT函数将横表转换成纵表或者将纵表转换成横表。这种转换方式可以使数据呈现更清晰、更方便,从而增强数据分析及展示的可操作性。