Oracle中的行合并,在不同的列中为空

问题描述 投票:0回答:2

我的查询是根据人口统计从两个不同的客户表中提取基本人口。两个表共享许多列,例如名称,ID,城市,州和邮政编码。表A包含不在表B中的2列(状态2和状态3)。表B包含1个不在表B(国家/地区)中的列。

我使用工会来合并两个基本人口。每个基本人群都有一些重复的名字,但不是全部。有些对于每个基本人口而言都是唯一的,因为它们存在于一个表中,而不存在于另一个表中。联合不会删除两个表中都存在的重复项,因为它们在表A唯一列中具有信息,但在表B唯一列中具有信息,反之亦然。我需要弄清楚如何将它们合并为一行,所有3列均显示适用的数据。请参见示例输出:

ID   Name   City     State   State2   State3   Zip   Country   Phone   Order Year   Order Status
111  Bob    Anytown  MP                       55555    US     555-5555  2020         Valid
111  Bob    Anytown  MP       MP       MP     55555           555-5555  2020         Valid 

我想返回以下内容:

ID   Name   City     State   State2   State3   Zip   Country   Phone   Order Year   Order Status
111  Bob    Anytown  MP       MP        MP    55555    US     555-5555  2020         Valid

我尝试使用不存在的逻辑,并且还尝试在不具有空条件的情况下将联合基础加入其自身,但未能获得我想要的结果。谢谢!

sql oracle merge rows
2个回答
0
投票

您需要合并各个列,然后获取不同的组合,如:

SELECT DISTINCT d1.ID,
                COALESCE(d1.NAME, d2.NAME) AS NAME,
                COALESCE(d1.City, d2.City) AS City,
                COALESCE(d1.State, d2.State) AS State,
                COALESCE(d1.State2, d2.State2) AS State2,
                COALESCE(d1.State3, d2.State3) AS State3,
                COALESCE(d1.Zip, d2.Zip) AS Zip,
                COALESCE(d1.Country, d2.Country) AS Country,
                COALESCE(d1.Phone, d2.Phone) AS Phone,
                COALESCE(d1.Order_Year, d2.Order_Year) AS Order_Year,
                COALESCE(d1.Order_Status, d2.Order_Status) AS Order_Status
  FROM CUST_DATA d1
  LEFT OUTER JOIN CUST_DATA d2
    ON d2.ID = d1.ID AND
       d2.ROWID <> d1.ROWID

db<>fiddle here


0
投票

如果只有3 columns有问题,则可以使用group bymax/min来创建一条具有non-null数据的记录,如下所示:

Select id, name, city, state,
       Max(state2) as state2,
       Max(state3) as state3,
       Zip,
       Max(country) as country,
       Phone,
       "Order Year",
       "Order Status"
  From (your_union_query)
Group by id, name, city, state,
       Zip, Phone, "Order Year", "Order Status"

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.