2017-08-22 60 views
0

我有一个名为Issue_Status的专栏,它列出了风险管理中主要涉及的问题的当前状态。我需要在Cognos和/或SQL Server中创建一个新列,以呈现问题的所有先前状态的连接列。它是这样的。如果您从单列中获取数据,如何创建连接列?

现在,我没有Issue_Status_Concatenated。

它是这样的。

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功能)

Issue I.D Issue Status   Running_Count 

1234  Draft    1 
1234  Open     2 
1234  Closed    3 
5678  Draft    1 
5678  Pending    2 
5678  Closed    3 
5678  Cancelled   4 
3333  Draft    1 
3333  Pending    2 
3333  Pending    3 
3333  Pending    4 

然后使用的情况下,功能

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 

然后我计划将结果合并一列中创建一个新的数据项或一个新的列,方法是创建Issue_Status_Concatenated,将所有新的concat列从1到

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 
+2

请选择正确的数据库系统..不要标记mysql,sql-server和oracle11g –

+0

确定完成。我不确定我们当前使用的是哪种RDBMS,如果它是sql server或Oracle 11g – BA82283

+0

您的实际期望输出是什么?您帖子的结尾看起来不像您想要的。你想为每个问题状态值设置一个不同的列吗?或者你真的想要一个单独的字段与给定问题的每个值分隔吗? –

回答

1

下方代码段将帮助您获取设计在oracle中输出rd。希望这可以帮助。

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 
); 
0

的行对于SQL服务器,你可以使用下面的查询,让您的结果 -

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] 
相关问题