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函数的基本语法

来自定义转换列和汇总函数,实现各种复杂的数据转换和汇总。