2017-12-17 12 views
-1

レポートに含まれる行を減らそうとしています。このクエリで返されるアセットは2つありますが、1つの行に表示する必要があります。行を統合する

基本的に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

私は私はあなたが何を言っているか理解していません。テストケースは確かに役に立ちます。あなたが投稿したクエリは、2つの行を返します(私たちがどのものを見た場合のみ...)が、メッセージに添付したイメージとして表示されることを望みます。

一般的に言えば、特定の列の残りの部分を含む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節で作成)は、現在のクエリの結果になります。