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

Sql 一个唯一ID的共同申请人姓名和地址从多行到多列,sql,oracle,oracle12c,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, (S

这就是问题所在

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'  
我需要以下格式的数据


我想您可以先进行条件聚合,然后使用表-

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;
在您指定确定性order子句之前,SQL表表示无序集。所以我使用ORDERBY子句作为co_申请人名称。因此,从您的样本数据来看,Sanjay位于第二列,Vihjay位于第三列


是小提琴。

您可以按如下方式使用
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,请使用
行编号
中的
分区依据
子句,如下所示:

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>

干杯

请提供输入值,在网站上的预期输出,而不是作为图像,以便在帮助他们可以使用插入和更新。此外,发布您试图获得的期望输出。Aamir Khan,是否没有固定的共同申请人或他们是可变的?申请人的数量最多可以是5个。它适用于一个ID,但我的记录有多个ID和多个与唯一ID相关的列。好,您可以在更新部分great@tejash it works中提到的第_行中使用PARTITION BY子句。还有一个帮助,如何更改通过枢轴的列的位置?请更改(1,2,3)中RN的
中的顺序或使用外部选择更改更具体的顺序。
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>