典型回答

在Oracle中,有专门的函数实现了行转列和列转行的功能,分别是pivot和unpivot函数。

**PIVOT**** 用于将行数据转换为列数据**。通常应用在需要对数据进行聚合(如求和、计数等)并将某一列的不同值转化为列名的情况。

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

yearproductsales
2020A100
2020B200
2021A150
2021B300

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

yearAB
2020100200
2021150300

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

1
2
3
4
5
6
SELECT *
FROM sales
PIVOT (
  SUM(sales) FOR product IN ('A' AS A, 'B' AS B)
)
ORDER BY year;

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

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

yearAB
2020100200
2021150300

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

yearproductsales
2020A100
2020B200
2021A150
2021B300

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

1
2
3
4
5
6
7
8
9
SELECT 
    year,
    product,
    sales
FROM sales_data
UNPIVOT (
    sales FOR product IN (A AS 'A', B AS 'B')
)
ORDER BY year, product;

扩展知识

其他实现

不是用函数的其他实现方式,可以参考MySQL中的实现:

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