0

我有一个示例数据:

Johnson; Michael, Surendir;Mishra, Mohan; Ram
Johnson; Michael R.
Mohan; Anaha
Jordan; Michael
Maru; Tushar

查询的输出应该是:

Johnson; Michael   2
Mohan; Anaha       1
Michael; Jordon    1
Maru; Tushar       1
Surendir;Mishra    1
Mohan; Ram         1

如您所见,它打印了每个名称的计数,以 分隔,但有所不同。我们不能简单地对全名进行分组,因为有时名称可能包含中间名第一个首字母,有时可能不包含。例如。Johnson; Michael并且Johnson; Michael R.被计为单个名称,因此它们的计数为 2。进一步Johnson; Michael应该出现或Johnson; Michael R.应该出现在计数为 2 的结果集中(不能同时出现,因为这将是重复记录)

该表包含由 分隔的名称,并且由于它是 LIVE 并且由其他人提供给我们,因此无法对其进行非规范化。

有没有在不使用游标的情况下为此编写查询?我的数据库中有大约 300 万条记录,我还必须支持分页等。您认为实现这一目标的最佳方式是什么?

4

1 回答 1

2

这就是为什么你的数据应该被标准化的原因。

;with cte as  
( 
    select 1 as Item, 1 as Start, CHARINDEX(',',People+',' , 1) as Split, 
           People+',' as People 
    from YourHorribleTable
    union all 
    select cte.Item+1, cte.Split+1, nullif(CHARINDEX(',',people, cte.Split+1),0), People as Split 
    from cte 
    where cte.Split<>0   
)    
select Person, COUNT(*)
from
(
select case when nullif(charindex (' ', person, 2+nullif(CHARINDEX(';', person),0)),0) is null then person  
    else substring(person,1,charindex (' ', person, 2+nullif(CHARINDEX(';', person),0)))
    end as Person
from
(
select LTRIM(RTRIM( SUBSTRING(people, start,isnull(split,len(People)+1)-start))) as person
from cte  
) v
where person<>''
) v
group by Person
order by COUNT(*) desc
于 2012-09-12T11:46:21.107 回答