多行至多列的共同申请人名称和唯一ID的地址

时间:2019-12-18 09:31:03

标签: sql oracle oracle12c

这是查询

SELECT b.ID, e.customername AS "Applicant name",
       f.address AS "Applicant address",
       x.customername AS "Co-Applicant name",
       x.address AS "Co-Applicant address"
  FROM table_1 b,
       table_2 e,
       table_3 f,
       (SELECT b.customername, g.agreementid, a.address
          FROM table_2 g, table_4 x, table_2 b, table_3 a
         WHERE g.ID = x.ID
           AND b.customerid = x.custid
           AND b.customerid = a.custid
           AND x.flag <> 'G') x
 WHERE b.custid = e.customerid
   AND f.custid = b.lesseeid
   AND f.bptype = 'LS'
   AND f.mailingaddress = 'Y'
   AND b.ID = x.ID
   AND b.ID='101'  

数据以以下格式显示。

+-----+-------+----------+--------------+----------+
| ID  | name  | address  | co-applicant | address  |
+-----+-------+----------+--------------+----------+
| 101 | aamir | address1 | rahul        | London   |
| 101 | aamir | address1 | vijay        | Paris    |
| 101 | aamir | address1 | sanjay       | New York |
+-----+-------+----------+--------------+----------+

我需要以下格式的数据

![ID name address name_1 address name_2 address 101 aamir address1 rahul London vijay Paris
102 Anil address2 Suyash Mumbai Rajesh Delhi Prakash Kolkata]
1

2 个答案:

答案 0 :(得分:0)

我想您可以先进行条件聚合,然后再与表联接-

WITH DATAA AS (SELECT 101 ID, 'aamir' name, 'address1' address, 'rahul' co_applicant, 'london' co_address FROM DUAL
               UNION ALL
               SELECT 101, 'aamir', 'address1', 'vijay', 'Paris' FROM DUAL
               UNION ALL
               SELECT 101, 'aamir', 'address1', 'sanjay', 'New York' FROM DUAL
               ),
     TEMP AS (select D.*, ROW_NUMBER() OVER(PARTITION BY name ORDER BY co_applicant) RN from DATAA D)
SELECT ID, NAME, ADDRESS
      ,MAX(CASE WHEN RN = 1 THEN CO_APPLICANT ELSE NULL END) AS name_1
      ,MAX(CASE WHEN RN = 1 THEN CO_ADDRESS   ELSE NULL END) AS ADDRESS_1
      ,MAX(CASE WHEN RN = 2 THEN CO_APPLICANT ELSE NULL END) AS name_2
      ,MAX(CASE WHEN RN = 2 THEN CO_ADDRESS   ELSE NULL END) AS ADDRESS_2
      ,MAX(CASE WHEN RN = 3 THEN CO_APPLICANT ELSE NULL END) AS name_3
      ,MAX(CASE WHEN RN = 3 THEN CO_ADDRESS   ELSE NULL END) AS ADDRESS_3
FROM TEMP
GROUP BY ID, NAME, ADDRESS;

为了澄清起见,SQL表表示无序集,直到您指定确定性顺序子句为止。因此,我使用order by子句作为co_applicant名称。因此,根据您的样本数据,Sanjay排在第二列,而Vihjay排在第三列。

Here是小提琴。

答案 1 :(得分:0)

您可以按以下方式使用PIVOT

SQL> WITH DATAA AS
  2  (
  3  SELECT 101 ID, 'aamir' name, 'address1' address, 'rahul' co_applicant, 'london' co_address FROM DUAL UNION ALL
  4  SELECT 101, 'aamir', 'address1', 'vijay', 'Paris' FROM DUAL UNION ALL
  5  SELECT 101, 'aamir', 'address1', 'sanjay', 'New York' FROM DUAL
  6  )
  7  -- YOUR QUERY STARTS FROM HERE
  8  SELECT * FROM
  9      (
 10          SELECT
 11              T.*,
 12              ROW_NUMBER() OVER(ORDER BY NULL) AS RN
 13          FROM DATAA T
 14      ) PIVOT (
 15          MAX ( CO_APPLICANT ) AS NAME, MAX ( CO_ADDRESS ) AS ADDRESS
 16          FOR RN IN ( 1, 2,3 )
 17      );

        ID NAME  ADDRESS  1_NAME 1_ADDRES 2_NAME 2_ADDRES 3_NAME 3_ADDRES
---------- ----- -------- ------ -------- ------ -------- ------ --------
       101 aamir address1 rahul  london   vijay  Paris    sanjay New York

SQL>

注意:由于oracle不允许在查询中使用动态列,因此它将仅生成名称和地址的3种组合。如果存在3个以上共同申请者,则仅获取3个共同申请者的数据。

-更新-

如果您具有多个ID,请在PARTITION BY中使用ROW_NUMBER子句:

SQL> WITH DATAA AS
  2      (
  3      SELECT 101 ID, 'aamir' name, 'address1' address, 'rahul' co_applicant, 'london' co_address FROM DUAL UNION ALL
  4      SELECT 101, 'aamir', 'address1', 'vijay', 'Paris' FROM DUAL UNION ALL
  5      SELECT 101, 'aamir', 'address1', 'sanjay', 'New York' FROM DUAL UNION ALL
  6      SELECT 102 ID, 'Tejash' name, 'address2' address, 'chetan' co_applicant, 'london' co_address FROM DUAL UNION ALL
  7      SELECT 102, 'Tejash', 'address2', 'nirav', 'Paris' FROM DUAL UNION ALL
  8      SELECT 102, 'Tejash', 'address2', 'pulkit', 'New York' FROM DUAL
  9      )
 10      -- YOUR QUERY STARTS FROM HERE
 11      SELECT * FROM
 12          (
 13             SELECT
 14                 T.*,
 15                 ROW_NUMBER() OVER(PARTITION BY ID ORDER BY NULL) AS RN
 16             FROM DATAA T
 17         ) PIVOT (
 18             MAX ( CO_APPLICANT ) AS NAME, MAX ( CO_ADDRESS ) AS ADDRESS
 19             FOR RN IN ( 1, 2,3 )
 20         );

        ID NAME   ADDRESS  1_NAME 1_ADDRES 2_NAME 2_ADDRES 3_NAME 3_ADDRES
---------- ------ -------- ------ -------- ------ -------- ------ --------
       101 aamir  address1 rahul  london   vijay  Paris    sanjay New York
       102 Tejash address2 chetan london   nirav  Paris    pulkit New York

SQL>

干杯!