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>