【问题标题】:Converting rows into more columns将行转换为更多列
【发布时间】:2020-01-24 05:54:48
【问题描述】:

我有一个有 4 列的表格 ID,ROL_NUM,NAME,DEPT 并记录如下:

ID          ROL_NUM     NAME        DEPT
1           1           Rajasekar   CSE
1           1           Bala        CSE
1           1           Poo         IT
1           1           bhasker     CSE

我需要这个表的输出如下

ID          ROL_NUM             NAME                DEPT            NAME            DEPT            NAME            DEPT            NAME            DEPT
1           1                   Rajasekar           CSE             Bala            CSE             Poo             It              bhasker         CSE

有人提供建议或通过提供查询来帮助我。

【问题讨论】:

    标签: sql oracle pivot string-function


    【解决方案1】:

    您可以使用条件聚合进行此类旋转:

    select ID, rol_num, max( case when rn = 1 then name end ) as name1,
                        max( case when rn = 1 then dept end ) as dept1,
                        max( case when rn = 2 then name end ) as name2,
                        max( case when rn = 2 then dept end ) as dept2,
                        max( case when rn = 3 then name end ) as name3,
                        max( case when rn = 3 then dept end ) as dept3,
                        max( case when rn = 4 then name end ) as name4,
                        max( case when rn = 4 then dept end ) as dept4                    
      from
      (
      select t.*, row_number() over (order by t.name) as rn
        from tab t
       order by t.name 
      )
      group by ID, rol_num  
    

    Demo

    【讨论】:

    • 100 行怎么样?
    • 您的解决方案替代方案@AnkitBajpai 怎么样?
    • 我试图使用最多 10 列的枢轴来做到这一点,但只是卡住了双列枢轴。
    • 您可以在 SQL Server 中进行动态旋转,但在 Oracle 的 SQL @AnkitBajpai 中没有这种直接的方法
    • 嗯,正确。甚至我现在也认为这是实现预期结果的最佳方法之一。
    【解决方案2】:
    SELECT
    ID,
    ROL_NUM,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 1) NAME,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 2) DEPT,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 3) NAME,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 4) DEPT,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 5) NAME,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 6) DEPT,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 7) NAME,
    REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 8) DEPT
    from (SELECT ID
          ,ROL_NUM
          ,LISTAGG(NAME || ',' ||DEPT,',') WITHIN GROUP (ORDER BY ID) AS NAMEDEPT
    FROM TABLE1
    GROUP BY ID,ROL_NUM);
    

    输出

    ID  ROL_NUM NAME    DEPT    NAME    DEPT    NAME        DEPT    NAME    DEPT
    1   1       Bala    CSE     Poo     IT      Rajasekar   CSE     bhasker CSE
    

    演示:

    http://sqlfiddle.com/#!4/beb53/19

    【讨论】:

      【解决方案3】:

      以下查询可能会对您有所帮助。

      select
         id,
               rol_num,
         substr(SYS_CONNECT_BY_PATH(name, ','),2) name_list
      from
         (
         select
           id,
               rol_num,
           name,
           count(*) OVER ( partition by id) cnt,
           ROW_NUMBER () OVER ( partition by id order by name) seq
         from test where id is not null)
      where
         seq=cnt
      start with
         seq=1
      connect by prior
         seq+1=seq
      and prior id=id;
      

      输出

      ID    ROL_NUM      NAME_LIST
      1        1         Bala,Rajasekar
      

      同样,您可以添加 dept_list。

      【讨论】:

      • 这肯定不是预期的答案。
      • 显示名称和部门列中的所有行将不是可行的解决方案,因为可能有数千行。因此,在单列中以逗号分隔列表显示名称可能会有所帮助,然后可以根据需要将它们隔离。
      • 但这不是 OP 的要求。
      • 我提供了替代解决方案,因为我在 oracle 中找不到任何方法。
      猜你喜欢
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多