如何在 OBIEE 11g 中将多个结果连接成一行?

Posted

技术标签:

【中文标题】如何在 OBIEE 11g 中将多个结果连接成一行?【英文标题】:How to concatenate multiple result into one row in OBIEE 11g? 【发布时间】:2017-10-27 10:20:02 【问题描述】:

我想在 OBIEE 中创建一个报告,数据如下:

Table : CUST
CUST_INTRL_ID
1
2
3
4

Table : CUST_ID_DOC
CUST_INTRL_ID       DOC_TYPE_CD      DOC_NM
1                       1              A
1                       2              B
2                       1              A
2                       2              B

Table : CUST_EMAIL
CUST_INTRL_ID       EMAIL_ADDR_TX
1                   xyz@mail.com
1                   ghj@mail.com
2                   yui@mail.com

Table : CUST_PHON
CUST_INTRL_ID       PHON_NB
1                   123456
1                   765442
1                   845322
2                   342315
2                   423424
2                   874534

然后我想创建一个这样的报告:

CUST_INTRL_ID  DOC_TYPE_CD  DOC_NM    EMAIL_ADDR_TX              PHON_NB
1              1,2          A,B       xyz@mail.com,ghj@mail.com   123456,765442,845322                                     
2              1,2          A,B       yui@mail.com               342315,423424,874534

如何在 OBIEE 中完成此操作?在 SQL Query 中,我们可以这样做

SELECT X.CUST_INTRL_ID
  , LTRIM(RTRIM(LISTAGG(CASE WHEN R1=1 THEN X.EMAIL_ADDR_TX ELSE '' END, ', ') WITHIN GROUP (ORDER BY X.EMAIL_ADDR_TX))) AGG_EMAIL
  , LTRIM(RTRIM(LISTAGG(CASE WHEN R2=1 THEN X.PHON_NB ELSE '' END, ', ') WITHIN GROUP (ORDER BY X.PHON_NB))) AGG_PHON
  , LTRIM(RTRIM(LISTAGG(CASE WHEN R3=1 THEN X.DOC_TYPE_CD ELSE '' END, ', ') WITHIN GROUP (ORDER BY X.DOC_TYPE_CD))) AGG_DOC_TYPE
  , LTRIM(RTRIM(LISTAGG(CASE WHEN R3=1 THEN X.DOC_NM ELSE '' END, ', ') WITHIN GROUP (ORDER BY X.DOC_NM))) AGG_DOC_NM
FROM (
  SELECT CUST.CUST_INTRL_ID
    , CUST_EMAIL_ADDR.EMAIL_ADDR_TX
    , CUST_PHON.PHON_NB
    , CUST_ID_DOC.DOC_NM
    , CUST_ID_DOC.DOC_TYPE_CD
    , ROW_NUMBER() OVER (PARTITION BY CUST.CUST_INTRL_ID, CUST_EMAIL_ADDR.EMAIL_ADDR_TX ORDER BY CUST.CUST_INTRL_ID) R1
    , ROW_NUMBER() OVER (PARTITION BY CUST.CUST_INTRL_ID, CUST_PHON.PHON_NB ORDER BY CUST.CUST_INTRL_ID) R2
    , ROW_NUMBER() OVER (PARTITION BY CUST.CUST_INTRL_ID, CUST_ID_DOC.DOC_TYPE_CD ORDER BY CUST.CUST_INTRL_ID) R3
  FROM BUSINESS.CUST
  LEFT JOIN BUSINESS.CUST_EMAIL_ADDR ON CUST.CUST_INTRL_ID = CUST_EMAIL_ADDR.CUST_INTRL_ID
  LEFT JOIN BUSINESS.CUST_PHON ON CUST.CUST_INTRL_ID = CUST_PHON.CUST_INTRL_ID
  LEFT JOIN BUSINESS.CUST_ID_DOC ON CUST.CUST_INTRL_ID = CUST_ID_DOC.CUST_INTRL_ID
) X
GROUP BY X.CUST_INTRL_ID

但此查询耗时过长,并且 OBIEE 报告很长时间无法加载。 OBIEE 11g 存储库中是否有任何方法可以执行相同的操作,但速度更快?

谢谢。 问候, 杰根。

【问题讨论】:

【参考方案1】:

在 OBI 本身内部这样做是可能的,但毫无意义,因为这应该在物理上完成一次,而不是“在每个查询和逻辑上”。

仅从概念的角度来看,这是一种错误的方法

【讨论】:

以上是关于如何在 OBIEE 11g 中将多个结果连接成一行?的主要内容,如果未能解决你的问题,请参考以下文章

OBIEE 11g:空白字符

在 RPD 中使用的 OBIEE 11g EM 数据源连接

在不创建存储过程的情况下,如何在 Oracle 中将多行连接成一行? [复制]

你如何在熊猫中将多行连接成一行?

OBIEE 11g:如何导航到另一个报告并传递参数(使用 Go URL)?

如何在 OBIEE 11g 分析中获取前 2 年的数据