【问题标题】:Unpivot multiple column with empyt value取消旋转具有空值的多列
【发布时间】:2019-07-12 16:14:21
【问题描述】:

我有一个表 QUESTIONAIRE,其中包含 ID、Q1、Q2、Q3、R1、R2、R3 列。 数据如下:

ID , Q1 , Q2 , Q3 , R1 , R2 , R3 
==   ==   ==   ==   ==   ==   ==
1,   A,   B,   C,   Y,  NULL,  N
2,   Aa,  Bb,  Cc,  -,  N,     Y

我想把它安排成如下:

ID, QUESTION, ANSWER
==  ========  ======
1,   A,       Y
1,   B,       NULL
1,   C,       N
2,   Aa,      -
2,   Bb,      N
2,   Cc,      Y

【问题讨论】:

  • ...您也可能希望更正标题和问题正文中的拼写。
  • 如果您对数据库结构有任何控制权,请考虑更改为不同的结构。您不希望仅仅为了添加新问题或回复而改变结构,或者多次复制外键关系等内容。

标签: sql multiple-columns unpivot


【解决方案1】:

只需使用UNION 假设您正在创建一个新表 unpivoted 插入内容为:

INSERT INTO unpivoted
SELECT
id, Q1, R1

UNION

SELECT
id, Q2, R2

UNION

SELECT
id, Q3, R3

注意 id 会重复 3 次,我建议为 unpivoted 表设置一个唯一的 id

【讨论】:

    【解决方案2】:

    多个数据库支持横向连接。这是表达这种逻辑的一种更有效的方式。

    在 SQL Server 中,这看起来像:

    select q.id, v.q, v.r
    from questionnaire q cross apply
         (values (q1, r1), (q2, r2), (q3, r3)) v(q, r);
    

    Oracle 和 Postgres 支持类似的逻辑,但语法略有不同。

    【讨论】:

      【解决方案3】:

      如果您的数据库是SQL ServerOracle,则使用unpivot 关键字,如下所示:

      with t(ID , Q1 , Q2 , Q3 , R1 , R2 , R3) as
      (
       select 1,  'A',  'B',  'C',  'Y', NULL, 'N' union all
       select 2, 'Aa', 'Bb', 'Cc', '-' ,  'N', 'Y'  
      ), u2 as
      (
      select ID, QUESTION, R1, R2, R3, 
             row_number() over (partition by ID order by QUESTION) as rn
        from 
        (
         select u.* from
           (select t.*
              from t) p
         unpivot 
        (
        QUESTION for Title in (Q1,Q2,Q3)
        ) u
        ) u1
      )
      select ID, QUESTION, 
             case when rn = 1 then R1 
                  when rn = 2 then R2 
                  when rn = 3 then R3 
             end as ANSWER
        from u2;
      
      ID   QUESTION   ANSWER
      --   --------   ------
      1    A          Y
      1    B  
      1    C          N
      2    Aa         -
      2    Bb         N
      2    Cc         Y
      

      除了与上述示例数据查询相关的例外,union all 应替换为 from dual union all 用于 Oracle 数据库。

      Demo for SQL Server

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多