Skip to content

面试速答(先看这里)

**一句话结论:**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,结构如下:

yearproductsales
2020A100
2020B200
2021A150
2021B300

我们希望将 product 列中的值(A 和 B)转换为列,得到以下格式:

yearAB
2020100200
2021150300

在 Oracle 中,PIVOT 操作的实现如下:

sql
SELECT *
FROM sales
PIVOT (
  SUM(sales) FOR product IN ('A' AS A, 'B' AS B)
)
ORDER BY year;

**UNPIVOT** **用于将列数据转换为行数据。**通常用于将表中的列名转换成行数据,以便对数据进行进一步分析。

假设有一个表 sales_data,结构如下:

yearAB
2020100200
2021150300

我们希望将 A 和 B 列的数据转换成行数据,得到以下格式:

yearproductsales
2020A100
2020B200
2021A150
2021B300

在 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中的实现:

📄 ✅MySQL如何实现行转列和列转行?

打开文档:✅MySQL如何实现行转列和列转行?