✅Oracle中如何实现行转列和列转行?

✅Oracle中如何实现行转列和列转行?

典型回答

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

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

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

year product sales
2020 A 100
2020 B 200
2021 A 150
2021 B 300

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

year A B
2020 100 200
2021 150 300

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

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

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

year product sales
2020 A 100
2020 B 200
2021 A 150
2021 B 300

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

SELECT 
    year,
    product,
    sales
FROM sales_data
UNPIVOT (
    sales FOR product IN (A AS 'A', B AS 'B')
)
ORDER BY year, product;

扩展知识

其他实现

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

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