Oracle11g 如果要从单个列获取数据,如何创建连接列?

Oracle11g 如果要从单个列获取数据,如何创建连接列?,oracle11g,cognos,cognos-10,Oracle11g,Cognos,Cognos 10,我有一个名为“问题状态”的专栏,它展示了一个主要与风险管理相关的问题的当前状态。我需要在Cognos和/或SQL Server中创建一个新列,以显示问题所有以前状态的连接列。事情是这样的 Issue I.D Issue Status 1234 Draft 1234 Open 1234 Closed 5678 Draft 5678

我有一个名为“问题状态”的专栏,它展示了一个主要与风险管理相关的问题的当前状态。我需要在Cognos和/或SQL Server中创建一个新列,以显示问题所有以前状态的连接列。事情是这样的

Issue I.D   Issue Status   

1234        Draft           
1234        Open           
1234        Closed          
5678        Draft           
5678        Pending         
5678        Closed          
5678        Cancelled       
3333        Draft           
3333        Pending         
3333        Pending         
3333        Pending         
现在,我没有将问题与状态连接起来

事情是这样的

Issue I.D   Issue Status   

1234        Draft           
1234        Open           
1234        Closed          
5678        Draft           
5678        Pending         
5678        Closed          
5678        Cancelled       
3333        Draft           
3333        Pending         
3333        Pending         
3333        Pending         
我正在考虑使用一个运行计数函数(Cognos函数)

然后使用case函数在单个列中组合结果

New Concat_Column 1

case when Running_Count = 1 then Issue_status else ' ' end

New Concat_Column 2 

case when Running_Count = 2 then Issue_status else ' ' end

New Concat_Column 3 

case when Running_Count = 3 then Issue_status else ' ' end

New Concat_Column 4

case when Running_Count = 4 then Issue_status else ' ' end
然后,我计划创建一个新的数据项或一个新列,方法是通过将从1到1的所有新concat列合并在一起来创建Issue_Status_

New Concat_Column 1 + '|' + New Concat_Column  2 + '|' + New Concat_Column 3 + '|' + New Concat_Column 4
我知道这是一个漫长的过程,但我知道可以有一个更简单和合乎逻辑的方法来做到这一点?有没有办法让这更简单

Issue I.D   Issue Status   Issue_Status_Concatenated

    1234        Draft           Draft | Open | Closed
    1234        Open            Draft | Open | Closed
    1234        Closed          Draft | Open | Closed
    5678        Draft           Draft | Open | Closed |Cancelled
    5678        Pending         Draft | Open | Closed |Cancelled
    5678        Closed          Draft | Open | Closed |Cancelled
    5678        Cancelled       Draft | Open | Closed |Cancelled
    3333        Draft           Draft | Pending
    3333        Pending         Draft | Pending
    3333        Pending         Draft | Pending
    3333        Pending         Draft | Pending
如果它的sql server是

SELECT  i.issue_id,
    stuff((
            SELECT DISTINCT ' | ' + issue_status
            FROM issues i1
            WHERE i1.issue_id = i.issue_id for xml path('')),1,3,'')
            FROM issues i 
如果它的神谕可能是沿着listagg的路线

对于SQL server,您可以使用以下查询获得结果-

Create table #IssueLog (
[Issue I.D] int ,
[Issue Status] varchar(10)
)

insert into #IssueLog
select 1234 ,       'Draft'
union all  select 1234,     'Open'           
union all  select 1234,      'Closed'          
union all  select 5678,     'Draft'           
union all  select 5678,      'Pending'         
union all  select 5678,     'Closed'          
union all  select 5678,     'Cancelled'       
union all  select 3333,     'Draft'           
union all  select 3333,     'Pending'         
union all  select 3333,     'Pending'         
union all  select 3333,      'Pending'   


Select Main.[Issue I.D],
       Left(Main.[Issues],Len(Main.[Issues])-1) As [Issues]
From
    (
        Select distinct T2.[Issue I.D] ,
            (
                Select T1.[Issue Status] + '|' AS [text()]
                From #IssueLog T1
                Where T1.[Issue I.D] = T2.[Issue I.D]
                ORDER BY T1.[Issue I.D]
                For XML PATH ('')
            ) [Issues]
        From #IssueLog T2
    ) [Main]

下面的代码片段将帮助您在oracle中获得所需的输出。希望这有帮助

SELECT ID,
  STAT,
  LISTAGG(STAT,'|') WITHIN GROUP(
ORDER BY STAT) OVER(PARTITION BY ID) AGG_STAT
FROM
  (WITH TMP AS
  ( SELECT 1234 id, 'Draft' Stat FROM dual
  UNION ALL
  SELECT 1234 ID, 'Open' STAT FROM DUAL
  UNION ALL
  SELECT 1234 id, 'Completed' Stat FROM dual
  UNION ALL
  SELECT 1100 ID, 'Draft' STAT FROM DUAL
  UNION ALL
  SELECT 1100 ID, 'Pending' STAT FROM DUAL
  UNION ALL
  SELECT 1100 ID, 'Completed' STAT FROM DUAL
  UNION ALL
  SELECT 1100 id, 'Closed' Stat FROM dual
  )
SELECT tmp.*,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY 1 DESC) RN FROM tmp
  );

请选择正确的数据库系统。。不要标记mysql、sql server和oracle11gOK已完成。我不确定我们目前使用的是哪种RDBMS,如果是sql server或Oracle 11G,您实际想要的输出是什么?你文章的结尾看起来不像你想要的。您是希望每个问题状态值有一个不同的列,还是真的希望一个字段用给定问题的每个值分隔?您可能不希望在Cognos中这样做。我认为您需要在Oracle/SQL Server中创建一个视图,然后将其添加到框架管理器中。我是报表开发人员,在SQL开发人员中没有权限为此创建视图,在框架管理器中也没有权限更新查询主题。所以我不得不在Cognos report studio中这样做