pivot函数:数据行转换为列名(行转列)[oracle]
Oracle 中的 PIVOT 函数用于将行数据转换为列名,通常用于数据透视和报表生成。它允许你将某个列的值转换为多个列,并对这些列进行聚合操作
示例
原表:
SELECT * FROM orders;
使用pivot函数后:
SELECT *
FROM (
SELECT product_id, quantity
FROM orders
)
PIVOT (
SUM(quantity)
FOR product_id IN (10 AS Product10, 20 AS Product20, 30 AS Product30)
);
对比2张截图,可以看到,pivot函数实际上是将某一列的值转换成了几个列
其语法是:
....from 表
PIVOT (
sum(需要聚合的字段)
FOR column1 IN (value1 AS 新字段1, value2 AS 新字段2, ...)
);
将column1 字段里面的值value1 , value2等转换成了新字段,新字段下的数据就是sum(需要聚合的字段), pivot改变的是from 后面的表的结构
错误示例1
这条sql错误的原因:
pivot函数已经改变了orders这张表里面结构,即列名已经被改变,quantity列已经不存在
错误示例2
在 PIVOT 操作中,如果没有指定分组列,Oracle 会将所有其他列(除了用于透视的列和聚合的列)视为分组列.
此查询是对 orders 表进行透视操作,但没有指定一个明确的分组列。
用于透视的列:product_id
聚合的列:quantity
所以,分组列是:CUSTOMER_REF
聚合方法一:
使用一个子查询来显式地指定分组列,即
聚合方法二:
对查询结果使用sum()函数
这种方式需要对 PIVOT 后的结果集进行额外的聚合操作,性能比直接聚合方法一差