解析名字和姓氏

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

我为此使用 SQL Server 2008。我试图与包含全名值的列分开解析名字和姓氏。解析后,我想将该值存储在不同的列中。表中存在重复的记录,例如客户编号(

Cust_No
),但每个重复的 cust_no 的联系方式都不同。例如下面的例子,一个客户可以有很多联系人:

cust_no     contact name
-------------------------
1234        John Doe
1234        Jack Smith

我想将 John 与 Doe 分开解析,并将值存储在名为

FirstName1
LastName1
的不同列中。同样,在解析联系人姓名列中的值后,我希望分别为 Jack 和 Smith 提供
FirstName2
LastName2
列。结果应如下所示,具有独特的
cust_no

cust_no    FirstName1   LastName1    FirstName2   LastName2
-----------------------------------------------------------
1234       John         Doe          Jack         Smith

使用 SQL Server 查询设计器 (SQL Server 2008),我尝试通过添加

cust_no
作为输出并在
cust_no
上使用 group by 来在客户表上创建视图。此外,我将该视图/查询用作左侧的主表,并将其与另一个具有许多记录的表(右侧)链接。我设法从联系人姓名列中解析 FirstName1 和 LastName1,但无法从 SQL Server 表的联系人姓名列中解析第二组 FirstName2 和 LastName2,并重复
cust_no

我上面描述的方法可能不明确,但我想知道是否有函数可以用来根据重复的名称单独解析

cust_no
。有没有办法解析这些值以获得所需的输出?

sql sql-server parsing sql-server-2008 duplicates
1个回答
1
投票

如果你的数据像你说的那样一致。

parsename()
可以选择使用条件聚合

示例

Select cust_no
      ,LName1 = max( case when RN=1 then LName end)
      ,FName1 = max( case when RN=1 then FName end)
      ,LName2 = max( case when RN=2 then LName end)
      ,FName2 = max( case when RN=2 then FName end)
 From ( 
        Select cust_no
              ,RN    = row_number() over (partition by cust_no order by [contact name])
              ,LName = parsename(replace([contact name],' ','.'),1)
              ,FName = parsename(replace([contact name],' ','.'),2)
         From  YourTable
      ) A
 Group By cust_no

结果

cust_no LName1  FName1  LName2  FName2
1234    Smith   Jack    Doe     John

注意:

如果 Jack Smit 重复,请使用

dense_rank()
而不是
row_number()
。老实说,我不记得在 2008 年是否可以使用ensemble_rank()...它已经很过时了。

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