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

Multiple rows to multiple columns for co-applicant name and address for a unique ID

这是查询

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_1地址name_2地址 101 aamir address1 rahul London vijay Paris
102 Anil address2 Suyash Mumbai Rajesh Delhi Prakash Kolkata]1

我想你可以先进行条件聚合,然后再加入 table -

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 tables 表示无序集,直到您指定确定性顺序子句。所以我使用 order by 子句作为 co_applicant 名称。因此,根据您的样本数据,Sanjay 将出现在第二列,而 Vihjay 将出现在第三列。

Here 是 fiddle.

您可以使用 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>

注意:它只会生成 3 种名称和地址组合,因为 oracle 不允许在查询中使用动态列。如果有超过 3 个共同申请人,那么它只需要 3 个共同申请人的数据。

--更新--

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

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>

干杯!!