oracle pivot用法
时间: 2025-05-17 11:20:43 浏览: 33
### Oracle 中 PIVOT 语句的语法及示例
#### 基本语法
PIVOT 是一种用于行列转换的强大功能,可以将行数据转化为列数据。其基本语法如下:
```sql
SELECT *
FROM table_name
PIVOT (
aggregate_function(value_column)
FOR pivot_column IN (value_list)
);
```
其中:
- `aggregate_function` 是聚合函数,例如 `SUM`, `MAX`, 或者其他支持的聚合操作[^2]。
- `value_column` 是要进行聚合计算的目标列。
- `pivot_column` 是指定需要旋转的关键字列。
- `value_list` 列出了希望转置成列的具体值。
此结构能够实现基于特定条件的数据重组,从而简化复杂报表的需求[^3]。
#### 实际案例分析
假设存在一张名为 `testpivot` 的学生成绩表,记录了学生的姓名、课程以及对应的分数。如果想按科目统计每位同学的最佳成绩,则可采用以下SQL语句完成需求:
```sql
SELECT *
FROM testpivot
PIVOT(
MAX(分数) -- 使用最大值作为聚合方式
FOR 课程 IN ('语文', '数学', '物理') -- 将'课程'字段的不同取值变为新列头
) a;
```
上述例子中,`MAX(分数)` 函数被用来找出每门课最高的得分情况;而 `'语文','数学','物理'` 这些字符串代表不同科目的名称,在执行过程中它们会成为结果集中新的列标题[^4]。
另外需要注意的是,当实际业务场景下的类别较多或者不确定具体有哪些分类时,可以通过动态SQL来构建完整的 `IN()` 子句内容[^5]。
#### 动态处理未知类别的方法
对于那些事先无法枚举全部可能值得情形下,编写存储过程利用游标读取唯一键值并拼接至最终查询串里是一种常见解决方案。下面给出一段伪代码示意如何生成适应更多种类项数的Pivot表达式:
```plsql
DECLARE
v_sql VARCHAR2(32767);
BEGIN
SELECT LISTAGG('''' || column_value || ''' AS "'||column_value||'" ', ', ') WITHIN GROUP (ORDER BY column_value) INTO v_sql FROM TABLE(CAST(MULTISET(SELECT DISTINCT course FROM testpivot )AS SYS.ODCIVARCHAR2LIST));
EXECUTE IMMEDIATE '
CREATE OR REPLACE VIEW vw_pivoted_data AS
SELECT *
FROM testpivot t
PIVOT(MAX(score) FOR course IN ('||v_sql||'))';
END;
/
```
这里运用到了 `LISTAGG` 来汇总各个独立项目形成逗号分割列表形式,并嵌入到后续创建视图命令之中去自动适配变化中的维度信息。
---
阅读全文
相关推荐


















