如何在 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 中将多个结果连接成一行?的主要内容,如果未能解决你的问题,请参考以下文章
在不创建存储过程的情况下,如何在 Oracle 中将多行连接成一行? [复制]