我正在尝试减少报告中的行数。此查询有2个资产返回,但我希望它们显示在一行上。
基本上,如果dc.name LIKE'%CT / PT%',那么我希望它与资产相同。 SP.SVC_PT_ID是加入它们的公共字段。
有时候没有dc.name LIKE'%CT / PT%'但是我仍然希望DV.MFG_SERIAL_NUM只用右边的Null填充。
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;
答案 0 :(得分:0)
我不确定我明白你在说什么;测试用例肯定有帮助。你说你发布的查询返回两行(只有当我们看到哪些...时),但你希望它们显示为你附加到邮件的图像。
一般来说,您可以使用某些列上的聚合函数(如MAX)以及包含其余列的GROUP BY子句来执行此操作。
仅举例:
select svc_pt_id, max(ctpt_name) ctpt_name, sum(ctpt_multipler) ctpt_multipler
from ...
group by svc_pt_id
正如我所说:测试用例可以帮助那些想要回答这个问题的人。没错 - 有人可能比我更了解它并且会提供帮助。
编辑:在你发布样本数据之后(顺便说一句,不要匹配你之前发布的截图),也许这样的事情可能会起作用:使用分析函数检查名称是否包含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>
我的TEST表(由WITH factoring子句创建)将是您当前查询的结果。