【问题标题】:Transform table from rows to columns in oracle SQL将表从行转换为 oracle SQL 中的列
【发布时间】:2022-11-16 14:45:49
【问题描述】:

将表从行转换为列

现有表A

我如何从下面的第一个表转换为第二个表?

预期成绩

如果我执行类似于以下 sql 语句的操作,我只会将它们放在单独的行中,而不是将相关的放在一行中

SELECT 
        CASE WHEN LENGTH(CODE) = 2 THEN NAME
        ELSE NULL
        END AS CODE1,
        CASE WHEN LENGTH(CODE) = 4 THEN NAME
        ELSE NULL
        END AS CODE2,
        CASE WHEN LENGTH(CODE) = 6 THEN NAME
        ELSE NULL
        END AS CODE3,
        CASE WHEN LENGTH(CODE) = 8 THEN NAME
        ELSE NULL
        END AS CODE4
FROM TABLEA;

【问题讨论】:

  • 我确信使用枢轴方法是可能的。

标签: sql oracle-sqldeveloper


【解决方案1】:

您需要选择各种 CASE 表达式中的最大值:

SELECT 
    MAX(CASE WHEN LENGTH(CODE) = 2 THEN NAME END) AS CODE1,
    MAX(CASE WHEN LENGTH(CODE) = 4 THEN NAME END) AS CODE2,
    MAX(CASE WHEN LENGTH(CODE) = 6 THEN NAME END) AS CODE3,
    MAX(CASE WHEN LENGTH(CODE) = 8 THEN NAME END) AS CODE4
FROM TABLEA;

【讨论】:

    【解决方案2】:

    这是一种方法:

    create table table_a (
        code varchar(8),
        name varchar(50));
        
    
    insert into table_a 
    values ('25','ABC-25'), ('2510','BDC-2510'), ('251010','EFG-251010'), ('25101010','PIT-25101010');
    
    
    select * from  table_a;
    
    
    with 
    code1 as (select code, name from table_a where length(code)=2),
    code2 as (select code, name from table_a where length(code)=4),
    code3 as (select code, name from table_a where length(code)=6),
    code4 as (select code, name from table_a where length(code)=8)
    select c1.code as code1,
           c1.name as code_name1,
           c2.code as code2,
           c2.name as code_name2,
           c3.code as code3,
           c3.name as code_name3,
           c4.code as code4,
           c4.name as code_name4
      from code4 c4
      join code3 c3
        on substr(c4.code,1,6) = c3.code
      join code2 c2
        on substr(c3.code,1,4) = c2.code
      join code1 c1
        on substr(c2.code,1,2) = c1.code;
    

    结果:

    code1|code_name1|code2|code_name2|code3 |code_name3|code4   |code_name4  |
    -----+----------+-----+----------+------+----------+--------+------------+
    25   |ABC-25    |2510 |BDC-2510  |251010|EFG-251010|25101010|PIT-25101010|
    

    【讨论】:

      猜你喜欢
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多