Oracle将列转换为行的技巧(oracle中把列变成行)

Oracle将列转换为行的技巧

在 Oracle 中,我们通常使用 SELECT 语句来检索表中的数据。在某些情况下,我们可能需要将表中的列转换为行来进行比较或汇总数据。本文将讨论如何使用 Oracle 的技巧将列转换为行。

使用 DECODE 函数

DECODE 函数是 Oracle 的一个内置函数,可用于执行条件语句。我们可以使用 DECODE 函数来将多个列合并为一行。例如,假设我们有一个名为 STUDENT 的表,其中包含以下数据:

| ID | NAME | GRADE_1 | GRADE_2 | GRADE_3 |

|—-|——–|———|———|———|

| 1 | Alice | 90 | 85 | 95 |

| 2 | Bob | 80 | 90 | 75 |

| 3 | Charlie| 85 | 92 | 80 |

我们希望将成绩列转换为行,其中行的第一列是学生的姓名,其余三列是学生的三个成绩。使用以下查询,我们可以将列转换为行:

SELECT NAME, 
DECODE(rownum, 1, GRADE_1, 2, GRADE_2, 3, GRADE_3) GRADE
FROM STUDENT,
(SELECT rownum
FROM dual
CONNECT BY LEVEL
WHERE rownum

在这个查询中,我们使用了一个子查询来生成数字 1 到 3 的序列,以便我们可以将三个成绩列合并为一列。我们还使用了 DECODE 函数,它将从第一行开始检查每个行号。当 rownum 等于 1 时,函数返回 GRADE_1 列的值,当 rownum 等于 2 时,函数返回 GRADE_2 列的值,当 rownum 等于 3 时,函数返回 GRADE_3 列的值。

使用 PIVOT

Oracle 11g 引入了 PIVOT 关键字,该关键字允许我们将列转换为行。使用 PIVOT,我们可以将某些列作为行的头,并将其他列作为行的值。以下是使用 PIVOT 的查询示例:

SELECT *
FROM (SELECT NAME, SUBJECT, SCORE
FROM GRADE)
PIVOT (SUM(SCORE) FOR SUBJECT IN ('Math', 'English', 'History', 'Science'))
ORDER BY NAME;

在这个查询中,我们有一个名为 GRADE 的表,其中包含学生的姓名、科目和分数。我们使用了 PIVOT 关键字,将 SUBJECT 列转换为列的头,并将 SCORE 列作为行的值。注意,这里我们使用了 SUM 函数来汇总每个学生的分数。

使用 CONNECT BY LEVEL

通过 CONNECT BY LEVEL 关键字,我们可以使用 SELECT 语句从一个表中选择数据并将列转换为行。以下是一个示例查询:

SELECT NAME, subject, score
FROM (SELECT rownum AS id, name, Math, English, History, Science
FROM GRADE)
UNPIVOT (score FOR subject IN (Math, English, History, Science))
WHERE id
CONNECT BY id = PRIOR id + 1 AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
START WITH id = 1;

这个查询与我们之前提到的查询不同的是,我们使用了 UNPIVOT 运算符将列转换为行。UNPIVOT 语法是:

UNPIVOT (measure_columns FOR pivot_column IN (pivot_column_list))

在我们的查询中,我们需要指定要转换的度量列和要作为行头的列。在这个示例中,我们使用 CONNECT BY LEVEL 语法来生成一个序列,从而将行数据转换为列数据。

结论

在本文中,我们介绍了 Oracle 中将列转换为行的三种技巧。每个技巧都是使用不同的语法和函数来实现的。使用这些技巧,您可以更好地组织和分析表中的数据,并根据需要将其转换为所需的格式。


数据运维技术 » Oracle将列转换为行的技巧(oracle中把列变成行)