Oracle SQL:在一行中合并两个结果

时间:2019-07-16 01:44:21

标签: sql oracle

我当前正在创建一个SQL查询,以从通过ID连接的两个表中获取所有记录的结果。如果有多条记录链接到来自另一个表的1个id,是否仍要在1行中返回结果?以下是我的SQL查询,当前结果以及查询的预期结果。

当前查询:

SELECT
    'A' AS "actionIndicator", 'A' AS "target",      
    crdExpt.CRD_PAN,
    acnExpt.ACN_ATP_ID, acnExpt.ACN_ACCOUNT_NUMBER,
FROM 
    tbl1 crdExpt, tbl2 acnExpt, tbl3 crdAcnExpt

其中tbl1是卡号的记录,tbl2是帐户号的记录,tbl3是卡号和帐户的链接。

当前结果如下:

CRD_PAN   | ACN_ATP_ID| ACN_ACCOUNT_NUMBER
123456789 | 23        | 99112345678
123456789 | 24        | 99012345678

我要实现的目标是,如果有2个帐号链接到1张卡,则预期输出为:

CRD_PAN   | ACN_ATP_ID| ACN_ACCOUNT_NUMBER |ACN_ATP_ID2 | ACN_ACCOUNT_NUMBER2
123456789 | 23        | 99112345678        | 24         | 99012345678

1 个答案:

答案 0 :(得分:1)

通过评论中的OP请求:

我在this SQL Fiddle上使用了以下示例数据(查询结果)

CREATE TABLE test(
  CRD_PAN VARCHAR(256),
  ACN_ATP_ID VARCHAR(256),
  ACN_ACCOUNT_NUMBER VARCHAR(256)
 );

 INSERT INTO test(CRD_PAN, ACN_ATP_ID, ACN_ACCOUNT_NUMBER)
 SELECT '123456789', '23', '99112345678' FROM DUAL
 UNION ALL
 SELECT '123456789', '24', '99012345678' FROM DUAL
 ;

从那里,我运行以下查询:

SELECT
  CRD_PAN,
  LISTAGG(ACN_ATP_ID, ', ') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID,
  LISTAGG(ACN_ACCOUNT_NUMBER, ',') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID

 FROM
   test

 GROUP BY
   CRD_PAN

哪个给了我

|  CRD_PAN  | ACN_ATP_ID |        ACN_ATP_ID       |
|:---------:|:----------:|:-----------------------:|
| 123456789 |   23, 24   | 99012345678,99112345678 |

所以,我相信一个解决方案可能是:

WITH 

    test AS (

        SELECT
          'A' AS "actionIndicator", 'A' AS "target",        
          crdExpt.CRD_PAN,
          acnExpt.ACN_ATP_ID, acnExpt.ACN_ACCOUNT_NUMBER,
        FROM tbl1 crdExpt, tbl2 acnExpt, tbl3 crdAcnExpt
    ),

    listdata AS (
        SELECT
            CRD_PAN,
            LISTAGG(ACN_ATP_ID, ', ') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID,
            LISTAGG(ACN_ACCOUNT_NUMBER, ',') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID

        FROM
            test

        GROUP BY
            CRD_PAN
    )

SELECT * FROM listdata

通过LISTAGG函数,您可以将多行移动到一个由某种字符分隔的行中(我用过,),并且使用了一个子查询来演示如何捕获数据,对其进行汇总以及然后退回

相关问题