主题
面试速答(先看这里)
**一句话结论:**PIVOT 用于将行数据转换为列数据 。
60秒标准回答:
在Oracle中,有专门的函数实现了行转列和列转行的功能,分别是pivot和unpivot函数
PIVOT 用于将行数据转换为列数据 。通常应用在需要对数据进行聚合(如求和、计数等)并将某一列的不同值转化为列名的情况
假设有一个表 sales ,结构如下
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**在Oracle中,有专门的函数实现了行转列和列转行的功能,分别是pivot和unpivot函数。
- **要点2:**假设有一个表 sales ,结构如下:
- **要点3:**我们希望将 product 列中的值( A 和 B )转换为列,得到以下格式:
- **要点4:**在 Oracle 中, PIVOT 操作的实现如下:
- **要点5:**在 Oracle 中, UNPIVOT 操作的实现如下:
**记忆锚点:**Oracle → UNPIVOT → PIVOT → sales_data → unpivot → product
追问准备:
- 围绕「Oracle」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「UNPIVOT」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「PIVOT」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
在Oracle中,有专门的函数实现了行转列和列转行的功能,分别是pivot和unpivot函数。
**PIVOT** 用于将行数据转换为列数据。通常应用在需要对数据进行聚合(如求和、计数等)并将某一列的不同值转化为列名的情况。
假设有一个表 sales,结构如下:
| year | product | sales |
|---|---|---|
| 2020 | A | 100 |
| 2020 | B | 200 |
| 2021 | A | 150 |
| 2021 | B | 300 |
我们希望将 product 列中的值(A 和 B)转换为列,得到以下格式:
| year | A | B |
|---|---|---|
| 2020 | 100 | 200 |
| 2021 | 150 | 300 |
在 Oracle 中,PIVOT 操作的实现如下:
sql
SELECT *
FROM sales
PIVOT (
SUM(sales) FOR product IN ('A' AS A, 'B' AS B)
)
ORDER BY year;**UNPIVOT** **用于将列数据转换为行数据。**通常用于将表中的列名转换成行数据,以便对数据进行进一步分析。
假设有一个表 sales_data,结构如下:
| year | A | B |
|---|---|---|
| 2020 | 100 | 200 |
| 2021 | 150 | 300 |
我们希望将 A 和 B 列的数据转换成行数据,得到以下格式:
| year | product | sales |
|---|---|---|
| 2020 | A | 100 |
| 2020 | B | 200 |
| 2021 | A | 150 |
| 2021 | B | 300 |
在 Oracle 中,UNPIVOT操作的实现如下:
sql
SELECT
year,
product,
sales
FROM sales_data
UNPIVOT (
sales FOR product IN (A AS 'A', B AS 'B')
)
ORDER BY year, product;扩展知识
其他实现
不是用函数的其他实现方式,可以参���MySQL中的实现: