Oracle中如何实现行转换列的操作(oracle中行转换成列)

Oracle中如何实现行转换列的操作

在实际工作中,经常会遇到需要将行数据转换成列数据的情况。Oracle数据库可以通过使用PIVOT语句或CASE语句实现行转换列的操作。

1. 使用PIVOT语句实现行转换列

PIVOT语句是Oracle 11g引入的新特性,它可以将行数据转换成列数据。具体语法为:

SELECT *

FROM (SELECT column1, column2, column3 FROM table_name)

PIVOT (

aggregate_function(column2)

FOR column1 IN (‘value1’, ‘value2’, ‘value3’)

);

其中,aggregate_function是聚合函数,包括SUM、AVG、COUNT等,column1是要转换的行数据列,column2是要聚合的列,’value1′, ‘value2’, ‘value3’是转换后的列名。

例如,有如下的销售表:

CREATE TABLE sales (

ID NUMBER,

YEAR NUMBER,

MONTH NUMBER,

AMOUNT NUMBER

);

ID YEAR MONTH AMOUNT

———————————

1 2019 1 100

2 2019 1 200

3 2019 2 150

4 2019 2 250

5 2019 3 300

6 2019 3 400

使用PIVOT语句将销售数据按年份和月份转换成列数据:

SELECT *

FROM (SELECT YEAR, MONTH, AMOUNT FROM sales)

PIVOT (

SUM(AMOUNT)

FOR (YEAR, MONTH) IN ((2019, 1) AS “2019_1”, (2019, 2) AS “2019_2”, (2019, 3) AS “2019_3”)

);

转换后的结果如下:

2019_1 2019_2 2019_3

———- ———- ———-

300 400 700

2. 使用CASE语句实现行转换列

除了PIVOT语句,Oracle中也可以使用CASE语句实现行转换列的操作。具体语法为:

SELECT

MAX(CASE WHEN column1 = ‘value1’ THEN column2 END) AS ‘value1’,

MAX(CASE WHEN column1 = ‘value2’ THEN column2 END) AS ‘value2’,

MAX(CASE WHEN column1 = ‘value3’ THEN column2 END) AS ‘value3’

FROM table_name;

其中,MAX函数用来聚合数据,CASE语句用来判断转换的列名和行数据的值。

以销售表为例,使用CASE语句将销售数据按年份和月份转换成列数据:

SELECT

MAX(CASE WHEN YEAR = 2019 AND MONTH = 1 THEN AMOUNT END) AS “2019_1”,

MAX(CASE WHEN YEAR = 2019 AND MONTH = 2 THEN AMOUNT END) AS “2019_2”,

MAX(CASE WHEN YEAR = 2019 AND MONTH = 3 THEN AMOUNT END) AS “2019_3”

FROM sales;

转换后的结果与PIVOT语句相同:

2019_1 2019_2 2019_3

———- ———- ———-

300 400 700

总结

Oracle数据库中可以通过PIVOT语句或CASE语句实现行转换列的操作。对于较大的数据集,PIVOT语句相对较快,但对Pivot中显示的字段以及聚合函数有限定。而 CASE语句可以自定义显示的字段以及聚合函数,但由于需要手动敲入代码,对于数据量较大和长时间需求的项目较为繁琐。在实际工作中,应根据实际情况选择合适的方式进行操作。


数据运维技术 » Oracle中如何实现行转换列的操作(oracle中行转换成列)