sql - 将扁平单行转换为多行 Oracle SQL

标签 sql oracle plsql oracle-sqldeveloper

我有一个数据库表,它基本上将“民意调查问题”维度扁平化到表中,每个问题占 1 列。

例如:这些是表中的列:

POLL1_QUESTION
POLL1_ANSWER

POLL2_QUESTION
POLL2_ANSWER

POLL3_QUESTION
POLL3_ANSWER

我想要做的是将每一行映射到一个新表中,如下所示:

QUESTION_NUMBER
QUESTION
ANSWER

问题编号列在我的用例中甚至不是必需的,但它会很好。

是否可以将这 1 行 6 列转换为 3 行 2 列?

最佳答案

如果您使用的是 Oracle 数据库 11g 或更高版本,则需要使用 UNPIVOT:

select *
from your_table
unpivot (
    (question, answer) 
    for question_id in (
        (question1, answer1) as 1,
        (question2, answer2) as 2,
        (question3, answer3) as 3
        )
);

对于 Oracle 11g 之前的版本,请使用 case(或 decode):

select
    n as question_id,
    case n
        when 1 then question1
        when 2 then question2
        when 3 then question3
    end as question,
    case n
        when 1 then answer1
        when 2 then answer2
        when 3 then answer3
    end as answer
from your_table
cross join (
    select level as n
    from dual
    connect by level <= 3
) x;

关于sql - 将扁平单行转换为多行 Oracle SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43876489/

相关文章:

sql - 帮助 SQL Server 触发器在插入前截断坏数据

mysql - Wordpress 自定义 SQL 以获取具有给定元值的三个帖子

sql - SQLite中Where子句中有多个条件时如何使用 "Or"语句?

sql - 有没有办法从 SQL 查询 AWS RDS Oracle DB 标识符?

c# - ORA-01722 : invalid number on INSERT in C# - Oracle 11g

mysql - SQL 比较表中的两行以找出有多少值不同

sql - java.sql.SQLSyntaxErrorException : ORA-00955: name is already used by an existing object

SQL - 当第 1 行满足 Case 条件时更改第 3 行的值

oracle - 如何使用 SQL*Plus 在 Oracle 11g 中显示数据库

sql - WHEN_VALIDATE 触发器中的 GO_BLOCK