2013-06-17 5 views
1

ОК Я работаю над таблицей базы данных с 4 столбцами, давая имя , имя, отчество, фамилию и идентификатор группы. Я хочу сгруппировать людей по тому факту, что они имеют одинаковые first и last names независимо от их middle name. Я также хочу, если вступает новая запись, введите эту запись в правильный идентификатор группы. Вот пример результата:Вычисление столбца на основе сопоставления других столбцов в таблице

---------------------------------------------------------- 
| First_Name | Middle_Name | Last_Name | Group_ID | 
---------------------------------------------------------- 
| Jon  | Jacob  | Schmidt | 1  | 
---------------------------------------------------------- 
| William | B.   | Schmidt | 1  | 
---------------------------------------------------------- 
| Sally  | Anne   | Johnson | 2  | 
---------------------------------------------------------- 

Я не уверен, является ли это подпадает под юрисдикцию вычисленной колонки, какой-то присоединиться или что-то гораздо менее неясными, пожалуйста, помогите!

+0

Ваш пример показывает, что '' Jon '=' William''. – HABO

+0

И если вы добавите «Джон Джонсон» к данным, какими будут новые группы? –

ответ

1

Если вам нужно только перечислить группы в запросе, то row_number() будет работать для вас:

declare @Names table (First_Name varchar(10), Middle_Name varchar(10), Last_Name varchar(10)) 
insert into @Names 
    select 'Jon', 'Jacob', 'Schmidt' union all 
    select 'William', 'B.', 'Schmidt' union all 
    select 'Sally', 'Anne', 'Johnson' union all 
    select 'Jon', 'Two', 'Schmidt' 

;with Groups (First_Name, Last_Name, Group_ID) as 
( select First_Name, Last_Name, row_number()over(order by Last_Name) 
    from @Names 
    group 
    by  First_Name, Last_Name 
) 
select n.First_Name, n.Middle_Name, n.Last_Name, g.Group_Id 
from @Names n 
join Groups g on 
     n.First_Name = g.First_Name and 
     n.Last_Name = g.Last_Name; 

Имейте в виду значение GROUP_ID изменится по мере появления новых nameGroups.

Если вы хотите назначить и , то сохраняйте group_ID, тогда я предложил бы создать вспомогательную таблицу и назначить там идентификаторы Group_ID.

Сохраняя сопоставление вне таблицы @Names, вы разрешаете пользователям изменять свои имена и не беспокоиться о переоценке назначения группы. Он также позволяет изменять логику группировки без повторного назначения имен. У вас также есть возможность на карте подобные достаточно значений для той же группировки (Джон, Джон, Джонни).

Group_ID состоит из First_Name и Last_Name. Итак, храните его таким образом.

declare @Names table (First_Name varchar(10), Middle_Name varchar(10), Last_Name varchar(10)) 
insert into @Names 
    select 'Jon', 'Jacob', 'Schmidt' union all 
    select 'William', 'B.', 'Schmidt' union all 
    select 'Sally', 'Anne', 'Johnson' union all 
    select 'Jon', 'Two', 'Schmidt' 

declare @NameGroup table (Group_Id int identity(1,1), First_Name varchar(10), Last_Name varchar(10) unique(First_Name, Last_Name)); 
insert into @NameGroup (First_Name, Last_Name) 
    select 'Jon', 'Schmidt' union all 
    select 'Sally', 'Johnson'; 


declare @Group_ID int; 

declare @First_Name varchar(10), 
     @Middle_Name varchar(10), 
     @Last_Name varchar(10) 

select @First_Name = 'Jon', 
     @Middle_Name = 'X', 
     @Last_Name = 'Schmidt' 

--be sure the Id has already been assigned 
insert into @NameGroup 
    select @First_Name, @Last_Name 
    where not exists(select 1 from @NameGroup where First_Name = @First_Name and Last_Name = @Last_Name) 

--resolve the id 
select @Group_ID = Group_ID 
from @NameGroup 
where First_Name = @First_Name and 
     Last_Name = @Last_Name; 

--store the name 
insert into @Names (First_Name, Middle_Name, Last_Name) 
    values(@First_Name, @Middle_Name, @Last_Name); 


select n.First_Name, n.Middle_Name, n.Last_Name, ng.Group_Id 
from @Names n 
join @NameGroup ng on 
     n.First_Name = ng.First_Name and 
     n.Last_Name = ng.Last_Name; 
+0

Спасибо! что на самом деле многое помогло! Я получил его сейчас – user2494918

Смежные вопросы