如果列x是重复记录-SQL,则合并列a、b、c

如果列x是重复记录-SQL,则合并列a、b、c,sql,netezza,Sql,Netezza,我不确定我的要求是否正确,但我试图让一行包含每个“策略”的所有数据。问题是,每行只给出一个“被保险人名称” 示例表: 我需要得到以下结果: 我该怎么做呢 ---编辑--- 如果只有一个被保险人,我希望被保险人姓名2为空我相信您希望以某种方式使用以下内容: SELECT DISTINCT a.insuredName, b.insuredName FROM table a INNER JOIN table b ON a.policyNumber = b.p

我不确定我的要求是否正确,但我试图让一行包含每个“策略”的所有数据。问题是,每行只给出一个“被保险人名称”

示例表:

我需要得到以下结果:

我该怎么做呢

---编辑---
如果只有一个被保险人,我希望被保险人姓名2为空

我相信您希望以某种方式使用以下内容:

    SELECT DISTINCT a.insuredName, b.insuredName 
    FROM table a 
    INNER JOIN table b 
     ON a.policyNumber = b.policyNumber
如果生效日期也是一个考虑因素:

    ...
    On a.policyNumber = b.policyNumber
    And a.effectiveDate = b.effectiveDate;

我向查询中添加了生效日期,因为我可以看到一个复合主键,其中既包括策略编号,也包括生效日期

这假设在更改现有表结构和数据时,可以接受数据视图

 SELECT a.PolicyNumber, a.effecitveDate a.insuredName as InsuredName1,   
        b.insuredName as InsuredName2
 FROM table a 
 INNER JOIN table b 
   ON a.policyNumber = b.policyNumber
  and A.effectiveDate = b.effectiveDate
确保将
table
更改为您的
tablename
具有此数据


此外,如果要确保单向匹配在联接上仅具有
和a.insuredName>B.insuredName
。这是根据jbrooks的一条优秀评论添加到这个列表中的。

因为如果名称是无限的,我会将它们连接到一个列中,然后在加载时再次将其拆分。我不知道Netezza,但您可以在SQL Server中这样做:

        SELECT PolicyNumber,
               InsuredDate,  
               STUFF(
                    (
                     SELECT ';'+ a.Path 
                     FROM Insured a 
                     WHERE t.PolicyNumber = a.PolicyNumber 
                     FOR XML PATH('')
                    ),1,1,'')  AS InsuredNames
        FROM (SELECT PolicyNumber, 
                     MIN(InsuredDate) AS InsuredDate 
              FROM Insured 
              GROUP BY PolicyNumber) t

生效日期可能也很重要(需要加入)。取决于表的键。我可以看到Jon Doe在2015年1月1日没有结婚,然后在2015年与Jane结婚,2016年1月1日,她也有同样的政策。没错。我还假设两个人是最大可能的共同保险人。提供的数据是正确的,但不一定是经过案例编辑的答案。你提出了一个很好的观点。。。如果有2个以上的投保人,我们如何选择投保人?您可以在select子句中使用子查询,但它有点讨厌,或者可能有多个连接,用于将所有投保人匹配到相同的保单编号,而不是他们自己。您是要删除记录并将结果组合在一起更改其中的表结构和数据,还是希望查看/查询返回所需结果的视图/查询是否更符合您的要求?@anton提出了一个很好的观点。如果同一保单下有两个以上的投保人,您希望在insuredname1和InsuredNamed2中使用什么名称?不,我不想删除现有的记录。我只需要获取结果数据并将其导出到.csv文件。在这种情况下,可以有任意数量的被保险人。基本上,我只需要在每个保单编号上有一行,可以包含x个被保险人。最常见的是1或2,但可能更多。对于具有2个被保险人的保单,这会导致在列InsuredName1和InsuredName2中有一行具有相同名称(John),然后是第二行,其结果是我所追求的(InsuredName1=John&InsuredName2=Jane)。对于只有1个被保险人的保单,这将导致行在保险名称1和保险名称2列中都有唯一被保险人。您还需要“和a.insuredName>b.insuredName”,否则您将得到“John”、“Jane”和“Jane”,John“选择InsuredName2时,我使用case语句将InsuredName2设置为NULL(如果它与InsuredName1匹配)。感谢大家朝着正确的方向努力<代码>当b.insuredName InsuredName1然后b.insuredName else为空时,以InsuredName2结尾@DustinN。jbrooks也有一个好主意,通过使用他的方法,您消除了对case的需要。@xQbert我尝试过实现它,但是,它消除了InsuredName2为NULL的所有策略,因此它只返回带有2个InsuredName的策略。我在尝试实现它时遇到了一个错误,即“find”XML(在char 170处)预期为“READ”。当然这与Netezza有关,我只是在快速搜索之后找不到任何错误。不过我会继续尝试。您需要了解Netezza如何允许您连接来自不同行的项目。它可能不像SQLServer那样使用XML。