2017-12-17 7 views
-1

Ich versuche, Zeilen in einem Bericht zu reduzieren. Es gibt 2 Assets, die bei dieser Abfrage zurückgegeben werden, aber ich möchte, dass sie in einer Zeile angezeigt werden.Konsolidieren Zeilen

Grundsätzlich, wenn dc.name wie '% CT/PT%' dann möchte ich es gleiche Zeile als das Asset sein. Die SP.SVC_PT_ID ist das allgemeine Feld, um sie zu verbinden.

Es wird Zeiten geben, wenn es keinen dc.name wie '% CT/PT%' gibt, aber ich möchte immer noch die DV.MFG_SERIAL_NUM nur mit einem Null auf der rechten Seite bevölkert.

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

Antwort

0

Ich bin mir nicht sicher, ob ich verstehe, was Sie sagen; Testfall würde sicherlich helfen. Sie haben gesagt, dass die von Ihnen gepostete Abfrage zwei Zeilen zurückgibt (nur wenn wir gesehen haben, welche ...), aber Sie möchten, dass sie als Bild angezeigt werden, das Sie an die Nachricht angehängt haben.

Im Allgemeinen können Sie das mit einer Aggregatfunktion (wie MAX) für bestimmte Spalten tun, zusammen mit der GROUP BY-Klausel, die den Rest enthält.

Nur zum Beispiel:

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

Wie gesagt: ein Testfall würde die Menschen helfen, die die Frage beantworten wollen würden. Stimmt - jemand hat es vielleicht viel besser verstanden als ich und wird trotzdem Hilfe leisten.

BEARBEITEN: Nachdem Sie Beispieldaten gepostet haben (die übrigens nicht mit dem Screenshot übereinstimmen, den Sie vorher gepostet haben), könnte etwas Ähnliches den Job erledigen: Verwenden Sie die analytische Funktion, um zu prüfen, ob der Name CT/PT enthält; wenn ja, nimm seine Daten. Andernfalls zeigen Sie beide Zeilen an.

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> 

Meine TEST-Tabelle (erstellt von WITH Factoring-Klausel) wäre das Ergebnis Ihrer aktuellen Abfrage.