首页 > 解决方案 > 将一列交换到另一列

问题描述

有n个父任务,每个任务都有它们的实际开始时间和实际结束时间,现在也有子任务,对于一个以“createprovision”结尾的父任务,我想用开始时间替换结束时间以“Preparations”开头的子任务

抱歉,我正在编辑问题

SELECT DISTINCT PCD.CHANGE_ID PARENT_CHANGE_ID,ICT2.TASK_ID PARENT_TASK_ID  
, NULL as INFRA_CHANGE_ID, NULL as INFRA_TASK_ID, NULL as OPS_CAT3,  
ICT2.ACTIVATE_TIME TASK_ACTIVATE_TIME,  
ICT2.ACTUAL_END_DATE ASK_ACTUAL_END_TIME,  
ICT2.SEQUENCE PARENT_SEQ,  
NULL as INFRA_SEQ,  
ICT2.NAME  
--ROUND(Business_Hours(timezone_convert(ICT2.ACTUAL_START_DATE), timezone_convert(ICT2.ACTUAL_END_DATE)  
--,7,18,'Sat/Sun'),2) TASK_MTRS_IN_HRS  
FROM   
V_ITSM_REPORT_CHANGE_DATA PCD  
JOIN V_ITSM_REPORT_CHANGE_TASK PCT ON PCD.CHANGE_ID=PCT.CHANGE_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_RELATIONS CR ON PCD.CHANGE_ID=CR.REQUEST_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_DATA ICD ON ICD.CHANGE_ID=CR.CHANGE_ID  
JOIN V_ITSM_REPORT_CHANGE_TASK ICT ON ICT.CHANGE_ID=ICD.CHANGE_ID   
JOIN V_ITSM_REPORT_CHANGE_TASK ICT2 ON ICT2.CHANGE_ID = PCD.CHANGE_ID  
JOIN V_ITSM_REPORT_CHANGE_TASK_WI WI ON WI.TASK_ID = ICT.TASK_ID   
where 1=1  
AND PCD.CHANGE_ID = 'CRQ000001307652'  
GROUP BY  
PCD.CHANGE_ID,  
ICT2.TASK_ID,  
ICT2.ACTIVATE_TIME,  
ICT2.ACTUAL_END_DATE,  
ICT2.SEQUENCE,  
ICT2.NAME  
UNION  
SELECT DISTINCT PCD.CHANGE_ID PARENT_CHANGE_ID, NULL as PARENT_TASK_ID,  
ICD.CHANGE_ID INFRA_CHANGE_ID,ICT.TASK_ID INFRA_TASK_ID,  
ICD.OPS_CAT3 OPS_CAT3,  
ICT.ACTIVATE_TIME TASK_ACTIVATE_TIME,  
ICT.ACTUAL_END_DATE TASK_ACTUAL_END_TIME,  
NULL AS PARENT_SEQ,  
ICT.SEQUENCE INFRA_SEQ,  
ICT.NAME  
--ROUND(Business_Hours(timezone_convert(ICT.ACTUAL_START_DATE), timezone_convert(ICT.ACTUAL_END_DATE)  
--,7,18,'Sat/Sun'),2) TASK_MTRS_IN_HRS  
FROM   
V_ITSM_REPORT_CHANGE_DATA PCD  
JOIN V_ITSM_REPORT_CHANGE_TASK PCT ON PCD.CHANGE_ID=PCT.CHANGE_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_RELATIONS CR ON PCD.CHANGE_ID=CR.REQUEST_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_DATA ICD ON ICD.CHANGE_ID=CR.CHANGE_ID  
JOIN V_ITSM_REPORT_CHANGE_TASK ICT ON ICT.CHANGE_ID=ICD.CHANGE_ID   
JOIN V_ITSM_REPORT_CHANGE_TASK_WI WI ON WI.TASK_ID = ICT.TASK_ID   
where 1=1  
AND PCD.CHANGE_ID = 'CRQ000001307652'  
GROUP BY  
PCD.CHANGE_ID,  
ICD.CHANGE_ID,  
ICD.OPS_CAT3,  
ICT.TASK_ID,  
ICT.ACTIVATE_TIME,  
ICT.ACTUAL_END_DATE,  
ICT.SEQUENCE,   
ICT.NAME  
order by PARENT_SEQ, INFRA_SEQ  

输出是 上述代码的输出

我想用值' slc-asset:global|win-global-createprovision '任务替换名称列的实际结束时间名称列中的Preparation Provisioning virtual任务激活时间

希望有意义

谢谢

拉克什

标签: sqloraclecase

解决方案


你有几个选择。可能您可以将查询重写为非联合版本,但是没有数据访问太难了,我无法为您提供帮助。第二个选项是分析函数:

select other_columns...,

       case name when 'slc-asset:global|win-global-createprovision' 
            then max(case when name = 'Preparation Provisioning virtual' 
                          then task_activate_time 
                     end) 
                 over (partition by parent_change_id)
            else task_actual_end_time
       end task_actual_end_time

  from (your_query)         

第三个选项是联合第一部分的子查询。如果您的表可能包含多个这样的行,请使用min(task_activate_time)或找到在这种情况下应该显示的适当行。

case when ict2.name = 'slc-asset:global|win-global-createprovision' 
     then (select activate_time 
             from v_itsm_report_change_task 
             where change_id = icd.change_id 
               and name = 'Preparation Provisioning virtual')
     else ict2.actual_end_date 
end task_actual_end_time

您使用group by,然后distinct,然后union。这些都是代价高昂的聚合。我认为您可以删除distinct并更改unionunion all.


推荐阅读