Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将行转换为更多列_Sql_Oracle_Pivot_String Function - Fatal编程技术网

Sql 将行转换为更多列

Sql 将行转换为更多列,sql,oracle,pivot,string-function,Sql,Oracle,Pivot,String Function,我有一个表,有4列ID,ROL\u NUM,NAME,DEPT,记录如下: ID ROL_NUM NAME DEPT 1 1 Rajasekar CSE 1 1 Bala CSE 1 1 Poo IT 1 1 bhasker CSE 我需要这个表的输出如下

我有一个表,有4列
ID
ROL\u 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

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

您可以使用条件聚合进行此类数据透视:

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  

输出

ID  ROL_NUM NAME    DEPT    NAME    DEPT    NAME        DEPT    NAME    DEPT
1   1       Bala    CSE     Poo     IT      Rajasekar   CSE     bhasker CSE
演示:


下面的查询可能对您有所帮助

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

类似地,您也可以添加部门列表。

100行怎么样?您的解决方案替代方案@AnkitBajpai如何?我曾尝试使用最多10列的pivot来实现这一点,但却遇到了双列pivot。您可以在SQL Server中实现动态数据透视,但在Oracle的SQL@AnkitbaJPAIHMM中没有这样直接的方法。甚至我现在也认为这是实现预期结果的最佳方法之一。这肯定不是预期的答案。在列中显示名称和部门的所有行将不是可行的解决方案,因为可能有数千行。因此,在单列中以逗号分隔的列表中显示名称会很有帮助,如果需要,可以将它们分隔开。但这不是OP的要求。我给出了另一种解决方案,因为我在oracle中找不到任何方法来做到这一点。
ID    ROL_NUM      NAME_LIST
1        1         Bala,Rajasekar