合并行

问题描述 投票:-1回答:1

我正试图减少报告中的行数。此查询有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;

oracle oracle-sqldeveloper
1个回答
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子句创建)将是您当前查询的结果。

© www.soinside.com 2019 - 2024. All rights reserved.