Oracle中的Pivot操作是一种非常有用的数据透视表技术。它可以将普通的表转换为更具可读性和概观性的形式,使用户可以更轻松地理解和分析数据。通过Pivot操作,用户可以将行转换为列,列转换为行,实现数据的交叉统计和聚合。以下是一些关于Oracle Pivot操作的详细介绍和示例。
语法
SELECT <非聚合项1>, <非聚合项2>, …, PIVOT ( <聚合函数>(<聚合项>) FOR <列项> IN (<列项值1>, <列项值2>, …) ) FROM <表名>
示例1:行转列
-- 原始表 CREATE TABLE EMP_SALARY( EMP_NO NUMBER(10), YEAR NUMBER(4), MONTH NUMBER(2), SALARY NUMBER(10,2) ); -- 插入数据 INSERT INTO EMP_SALARY (EMP_NO, YEAR, MONTH, SALARY) VALUES (1001, 2020, 1, 5000); INSERT INTO EMP_SALARY (EMP_NO, YEAR, MONTH, SALARY) VALUES (1001, 2020, 2, 5500); INSERT INTO EMP_SALARY (EMP_NO, YEAR, MONTH, SALARY) VALUES (1002, 2020, 1, 6000); INSERT INTO EMP_SALARY (EMP_NO, YEAR, MONTH, SALARY) VALUES (1002, 2020, 2, 6500); -- Pivot查询 SELECT * FROM EMP_SALARY PIVOT ( SUM(SALARY) FOR MONTH IN (1,2) );结果:
EMP_NO YEAR 1_SALARY 2_SALARY 1001 2020 5000 5500 1002 2020 6000 6500这个示例展示了如何将行转换为列。原始表包含基本的工资信息:员工号,年份,月份和薪水。通过Pivot操作,我们可以将月份列转换为对应的数据列(1和2),获得更易读、概观的数据集。
示例2:列转行
-- 原始表 CREATE TABLE SALES_DATA( YEAR NUMBER(4), REGION VARCHAR2(20), JAM NUMBER(10,2), BREAD NUMBER(10,2), BUTTER NUMBER(10,2) ); -- 插入数据 INSERT INTO SALES_DATA (YEAR, REGION, JAM, BREAD, BUTTER) VALUES (2020, 'North', 10000, 8000, 5000); INSERT INTO SALES_DATA (YEAR, REGION, JAM, BREAD, BUTTER) VALUES (2020, 'South', 12000, 9000, 6000); -- Unpivot查询 SELECT * FROM SALES_DATA UNPIVOT ( SALES FOR PRODUCT IN (JAM AS 'Jam', BREAD AS 'Bread', BUTTER AS 'Butter') );结果:
YEAR REGION PRODUCT SALES 2020 North Jam 10000 2020 North Bread 8000 2020 North Butter 5000 2020 South Jam 12000 2020 South Bread 9000 2020 South Butter 6000这个示例展示了如何将列转换为行。原始表包含销售数据,对应不同的产品和销售地区。通过Unpivot操作,我们可以将产品列和对应的销售数据列转换为一列,提取出销售数据的所有维度,以便更详细地分析和比较销售数据。
总结
Pivot和Unpivot操作是Oracle SQL中非常重要且常用的技术。它可以为我们提供更多的分析数据的方式,让我们能够更优秀的完成数据分析工作。它可以让用户的分析工作更快捷,方便,且易于理解。希望读者们可以根据自己的需要,更好的来使用Pivot和Unpivot操作。