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) GRADEFROM 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 NULLSTART WITH id = 1;
这个查询与我们之前提到的查询不同的是,我们使用了 UNPIVOT 运算符将列转换为行。UNPIVOT 语法是:
UNPIVOT (measure_columns FOR pivot_column IN (pivot_column_list))
在我们的查询中,我们需要指定要转换的度量列和要作为行头的列。在这个示例中,我们使用 CONNECT BY LEVEL 语法来生成一个序列,从而将行数据转换为列数据。
结论
在本文中,我们介绍了 Oracle 中将列转换为行的三种技巧。每个技巧都是使用不同的语法和函数来实现的。使用这些技巧,您可以更好地组织和分析表中的数据,并根据需要将其转换为所需的格式。