我为此使用 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
。有没有办法解析这些值以获得所需的输出?
如果你的数据像你说的那样一致。
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()...它已经很过时了。