2024年4月19日发(作者:)
oracle中pivot函数用法
Oracle中Pivot函数
在Oracle数据库中,Pivot函数可以用来将行数据转换为列数据,
提供了一种灵活的方式来汇总和显示数据。下面将列举一些Pivot函
数的用法并进行详细讲解。
基本语法
Pivot函数的基本语法如下:
SELECT <非汇总列>, [pivot_clause]
FROM <表名>
[WHERE <条件>]
[GROUP BY <非汇总列>]
[pivot_clause]
其中,pivot_clause表示将要进行转换的列,包括以下部分: -
{():表示要进行汇总的列。 - FOR IN (, , …, ):表示要进行转
换的列的取值。
简单示例
以下是一个简单的示例,展示如何使用Pivot函数将行数据转换
为列数据:
SELECT *
FROM (SELECT empno, job, sal
FROM emp)
PIVOT (SUM(sal) AS total_sal
FOR job IN ('MANAGER', 'SALESMAN', 'CLERK', 'ANAL
YST', 'PRESIDENT'))
上述示例中,我们使用了emp表,并对job列进行转换,统计每
个job类型的员工薪水总和。转换后的结果如下所示:
EMPNO | ‘MANAGER’ | ‘SALESMAN’ | ‘CLERK’ |
‘ANALYST’ | ‘PRESIDENT’ |
||||||| | 7369 | NULL | NULL | 800 | NULL | NULL | | 7499
| NULL | 1600 | NULL | NULL | NULL | | 7521 | NULL | 1250 |
NULL | NULL | NULL | | 7566 | NULL | NULL | NULL | 3000 |
NULL | | 7654 | NULL | NULL | NULL | 3000 | NULL | | 7698 |
2450 | NULL | NULL | NULL | NULL | | 7782 | 2450 | NULL |
NULL | NULL | NULL | | 7788 | NULL | NULL | NULL | NULL |
5000 | | 7839 | NULL | NULL | NULL | NULL | 5000 | | 7844 |
NULL | NULL | 1500 | NULL | NULL | | 7876 | NULL | NULL |
NULL | NULL | 1100 | | 7900 | NULL | NULL | NULL | NULL | 950
| | 7902 | NULL | NULL | NULL | NULL | 3000 | | 7934 | NULL |
NULL | 1300 | NULL | NULL |
从结果可以看出,每个job类型的薪水总和被转换为了相应列的
值。
动态列值
Pivot函数还支持动态列值,即根据实际数据自动确定列的值。
以下是一个示例:
SELECT *
FROM (SELECT empno, ename, sal, job
FROM emp)
PIVOT (SUM(sal) AS total_sal
FOR job IN (SELECT DISTINCT job FROM emp))
上述示例中,我们使用了DISTINCT子查询来获取emp表中job列
的不重复值,从而动态地确定了转换后的列的值。这样就可以适应任
何job类型的变化。
多个汇总函数
Pivot函数还支持在转换过程中进行多个汇总函数的计算。以下
是一个示例:
SELECT *
FROM (SELECT empno, ename, sal, job
FROM emp)
PIVOT (SUM(sal) AS total_sal, AVG(sal) AS avg_sal
FOR job IN ('MANAGER', 'SALESMAN', 'CLERK', 'ANAL
YST', 'PRESIDENT'))
上述示例中,我们不仅统计了每个job类型的员工薪水总和,还
计算了平均薪水。转换后的结果如下所示:
EMPNO | ‘MANAGER_TOTAL_SAL’ | ‘MANAGER_AVG_SAL’ |
‘SALESMAN_TOTAL_SAL’ | ‘SALESMAN_AVG_SAL’ |
‘CLERK_TOTAL_SAL’ | ‘CLERK_AVG_SAL’ | ‘ANALYST_TOTAL_SAL’
| ‘ANALYST_AVG_SAL’ |‘PRESIDENT_TOTAL_SAL’ |
‘PRESIDENT_AVG_SAL’ |
||–|-|—-|–|–||—|–|—-|—| | 7369 | NULL | NULL |
NULL | NULL | 800 | 800 | NULL | NULL | NULL | NULL | | 7499
| NULL | NULL | 1600 | 1600 | NULL | NULL | NULL | NULL |
NULL | NULL | | 7521 | NULL | NULL | 1250 | 1250 | NULL |
NULL | NULL | NULL | NULL | NULL | | 7566 | NULL | NULL |
NULL | NULL | NULL | NULL | 3000 | 3000 | NULL | NULL | |
7654 | NULL | NULL | NULL | NULL | NULL | NULL | 3000 | 3000
| NULL | NULL | | 7698 | 2450 | 2450 | NULL | NULL | NULL |
NULL | NULL | NULL | NULL | NULL | | 7782 | 2450 | 2450 |
NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | |
7788 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL
| 5000 | 5000 | | 7839 | NULL | NULL | NULL | NULL | NULL |
NULL | NULL | NULL | 5000 | 5000 | | 7844 | NULL | NULL |
NULL | NULL | 1500 | 1500 | NULL | NULL | NULL | NULL | |
7876 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL
| 1100 | 1100 | | 7900 | NULL | NULL | NULL | NULL | NULL |
NULL | NULL | NULL | 950 | 950 | | 7902 | NULL | NULL | NULL
| NULL | NULL | NULL | NULL | NULL | 3000 | 3000 | | 7934 |
NULL | NULL | NULL | NULL | 1300 | 1300 | NULL | NULL | NULL
| NULL |
从结果可以看出,每个job类型的薪水总和和平均薪水都被转换
为了相应列的值。
总结
Oracle中的Pivot函数提供了一种方便灵活的方式来将行数据转
换为列数据。通过以上列举的用法和示例,可以帮助你更好地理解和
运用Pivot函数。根据实际需求,你可以根据Pivot函数的基本语法
来自定义转换列和汇总函数,实现各种复杂的数据转换和汇总。


发布评论