【问题标题】:BIRT report: Oracle query: How can I get the output in single row for one PersonidBIRT 报告:Oracle 查询:如何获得一个 Personid 的单行输出
【发布时间】:2019-12-26 05:45:27
【问题描述】:

表:LABORCRAFTRATE:它有两个 cloumns

LABORCODE CRAFT
--------- ---------
SP51894   Replace
SP51894   Repair
SP51894   Connect
SP51894   MET1

表格:PERSON:5 列

PERSONID LOCATION STATUS FIRSTNAME LASTNAME
-------- -------- ------ --------- ---------
SP51894  Delhi    ACTIVE Smita     Patil

所需输出:7 列

PERSONID LOCATION STATUS FIRSTNAME LASTNAME Connection Replacement
-------- -------- ------ --------- -------- ---------- ------------
SP51894  Delhi    ACTIVE Smita     Patil    Yes        Yes

我的查询:

select distinct
       person.personid, person.location, person.status, person.firstname, person.lastname,
       case when (laborcraftrate.craft = 'CONNECT') then 'Yes' else null end as connection,
       case when (laborcraftrate.craft = 'REPLACE') then 'Yes' else null end as replacement  
from   maximo.person, maximo.laborcraftrate 
where  ((person.personid like '%PM02056%'))
and    person.personid= laborcraftrate.laborcode and person.status in ('ACTIVE','INACTIVE')
and    laborcraftrate.craft in ('CONNECT','REPLACE')
group by person.personid, person.location, person.status, person.firstname, person.lastname, laborcraftrate.craft;

此查询返回两行:

PERSONID LOCATION STATUS FIRSTNAME LASTNAME Connection Replacement
-------- -------- ------ --------- -------- ---------- ------------
SP51894  Delhi    ACTIVE Smita     Patil    Yes        
SP51894  Delhi    ACTIVE Smita     Patil                Yes

如何获得一个 Personid 的单行输出? Distinct 在 BIRT 中不起作用.. :(

【问题讨论】:

  • 顺便说一下,只需要 in 表达式周围的括号。其余的什么都不做。
  • 除了Barbaros Özhan提出的解决方案外,另一种可能是调整您的解决方案,并在CASE中的laborcraftrate表上进行子查询,而不是加入两个表

标签: sql oracle birt


【解决方案1】:

需要条件聚合。您可以在返回 ConnectionReplacement 列以及

时应用聚合
 GROUP BY PERSON.PERSONID, PERSON.LOCATION, PERSON.STATUS,PERSON.FIRSTNAME, PERSON.LASTNAME

条款:

SELECT P.PERSONID, P.LOCATION, P.STATUS, P.FIRSTNAME, P.LASTNAME,
       MAX(CASE
           WHEN (UPPER(L.CRAFT) = 'CONNECT') THEN
               'Yes'
           ELSE
                NULL
           END ) AS Connection,
       MAX(CASE
           WHEN (UPPER(L.CRAFT) = 'REPLACE') THEN
               'Yes'
           ELSE
                NULL
           END ) AS Replacement
  FROM maximo.PERSON P
  JOIN maximo.LABORCRAFTRATE L ON P.PERSONID = L.LABORCODE
 WHERE ((P.PERSONID LIKE '%SP51894%'))
   AND P.STATUS IN ('ACTIVE', 'INACTIVE')
   AND UPPER(L.CRAFT) IN ('CONNECT', 'REPLACE')
 GROUP BY P.PERSONID, P.LOCATION, P.STATUS, P.FIRSTNAME, P.LASTNAME;

Demo

【讨论】:

  • 还有一个问题,如果数据库中不存在 PERSONID,那么 PERSONID 列也应该在输出中显示该 ID,而其他列值为空白。
  • 不客气@Sonali,对不起,我无法回答你的问题。
  • 如果我的理解是正确的 - 要求在输出中始终有 1 条记录,即使数据库中没有这样的人。它可以通过一些丑陋的黑客(工会等)来完成。不知道有没有好的
  • 说 PersonId SP51894 在数据库中不存在。然后在输出结果中应该显示 PERSONID LOCATION STATUS FIRSTNAME LASTNAME Con​​nection Replacement -------- -------- ------ --------- ----- --- ---------- ------------ SP51894
  • 数据库是什么意思?对于PERSON.PERSONIDLABORCRAFTRATE.LABORCODE 或两者都不存在@Sonali?为什么SP51894 应该返回?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多