2017-12-17 21 views
-1

보고서에있는 행을 줄이려고합니다. 이 쿼리에서 반환하는 애셋이 2 개 있지만 한 행에 표시하려고합니다.행 통합

기본적으로 dc.name LIKE '% CT/PT %'인 경우 자산과 동일한 행으로 지정해야합니다. SP.SVC_PT_ID는 이들을 결합하는 공통 필드입니다.

dc.name LIKE '% CT/PT %'가없는 경우도 있지만 DV.MFG_SERIAL_NUM에는 Null이 오른쪽으로 채워지 길 원합니다.

enter image description here

Select SP.SVC_PT_ID, SP.DEVICE_ID, DV.MFG_SERIAL_NUM, dc.name, 
substr(dc.name,26) 
From EIP.SVC_PT_DEVICE_REL SP, 
eip.device_class dc, 
EIP.DEVICE DV 
Where SP.EFF_START_TIME < To_date('20170930', 'YYYYMMDD') + 1 
and SP.EFF_END_TIME is null 
and dc.id = DV.device_class_id 
and DV.ID = SP.device_id 
ORDER BY SP.SVC_PT_ID, DV.MFG_SERIAL_NUM; 

enter image description here

답변

0

나는 당신이 무슨 말을하는지 이해가 확실하지 않다; 테스트 케이스가 도움이 될 것입니다. 당신이 게시 한 쿼리가 두 행을 반환한다고 말했지 만 (어떤 것을 본 경우에만 ...) 메시지에 첨부 된 이미지로 표시되기를 원합니다.

일반적으로 말해서, 특정 열에서 나머지와 같은 GROUP BY 절과 함께 집계 함수 (예 : MAX)를 사용하여이를 수행 할 수 있습니다. 그냥 예를 들어

는 :

select svc_pt_id, max(ctpt_name) ctpt_name, sum(ctpt_multipler) ctpt_multipler 
from ... 
group by svc_pt_id 

내가 말했듯이 : 테스트 케이스가 질문에 대답 할 줄 사람을 도움이 될 것이다. 사실 - 누군가가 내가 생각했던 것보다 훨씬 더 잘 이해하고 도움을 줄 것입니다.

EDIT : 이전에 게시 한 스크린 샷과 일치하지 않는 샘플 데이터를 게시 한 후 다음과 같이 할 수 있습니다. 분석 함수를 사용하여 이름에 CT/PT가 포함되어 있는지 확인합니다. 그렇다면 데이터를 가져옵니다. 그렇지 않으면 두 행을 모두 표시하십시오.

SQL> with test as (
    2 select 14 svc_pt_id, 446733 device_id, 'Generic Electric' name from dual union 
    3 select 14, 456517, 'Generic CT/PT, Multiplier' from dual 
    4 ), 
    5 podaci as 
    6 (select svc_pt_id, device_id, name, 
    7  rank() over (partition by svc_pt_id 
    8     order by case when instr(name, 'CT/PT') > 1 then 1 
    9         else 2 
10       end) rnk 
11 from test 
12 ) 
13 select svc_pt_id, device_id, name 
14 from podaci 
15 where rnk = 1; 

SVC_PT_ID DEVICE_ID NAME 
---------- ---------- ------------------------- 
     14  456517 Generic CT/PT, Multiplier 

SQL> 

My TEST 테이블 (WITH factoring 절에 의해 작성 됨)은 현재 쿼리의 결과입니다.