Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Замена значений столбика в таблице по условию

Всем доброго времени суток.

Может кто подскажет решение.

Что бы упростить, покажу на вымышленных примерах. Существуют две таблицы: ФИО и Должности.Безымянный - копия.png

Безымянный.png

Задача состоит в том чтоб заменить значение поля ФИО на значение из поля должность. Т.е. если встречается подходящая фамилия в столбце ФИО то его значение переименовывается на соответствующую должность. Например: "Гожий Павел Анатольевич" будет заменен на "Маркетолог" и т.д. (Сразу оговорюсь что как-либо подготовить столбец ФИО не возможно т.к. в реальном проекте там названия агентств без пробелов и очень длинные). Я пробовал Applymap но она ищет только точно совпадающие значения, а функция MapSubstring ищет по маске но заменяет не все поле а только совпадающую часть по маске. Может быть это можно сделать с помощью цикла "For..next"?   

Заранее благодарен.

1 Solution

Accepted Solutions
Eugeny_Ilyin
Creator II
Creator II

Вот такой вариант:

Штаты:

LOAD * INLINE [

    Фамилия, Должность

    Бутенко, Директор

    Гожий, Завхоз

    Стремаков, Менеджер

    Кирсанов, Маркетолог

];

inner join LOAD * INLINE [

    ФИО

    БутенкоАлександрВладимирович

    ГожийПавелАнатольевич

    СтремаковСтепанПетрович

    ГольдштейнВладимирДмитриевич

    КирсановПетрНиколаевич

];

Tmp1:

NoConcatenate

LOAD * Resident Штаты

Where Index([ФИО],[Фамилия])>0;

DROP Table Штаты;

View solution in original post

9 Replies
Eugeny_Ilyin
Creator II
Creator II

День добрый.
А если при открытии таблицы ФИО, формировать ключевое поле для второй таблицы. И по нему уже производить сопоставление.
Или следует рассматривать вариант когда значение ФИО записано без пробелов?
Т.е. требуется провести анализ строки на предмет соответствия одному из значений из поля Фамилия? А если встретится Гольдштейн-Кирсанов?

Anonymous
Not applicable
Author

Добрый день EugenyIlyin

Спасибо за ответ.

Второй вариант предпочтительнее: следует провести анализ строки на предмет соответствия одному из значений из поля Фамилия. Вариант Гольдштейн-Кирсанов исключается, так как во первых по логике проекта такого не будет а во вторых соответствие следует проводить только если строка начинается с Фамилии, а не содержит ее вообще.

Eugeny_Ilyin
Creator II
Creator II

Штаты:

Mapping LOAD * INLINE [

    Фамилия, Должность

    Бутенко, Директор

    Гожий, Завхоз

    Стремаков, Менеджер

    Кирсанов, Маркетолог

];

Кадры:

LOAD ФИО, ApplyMap('Штаты',left(ФИО,index(ФИО,' ')-1)) as Должность INLINE [

    ФИО

    Бутенко Александр Владимирович

    Гожий Павел Анатольевич

    Стремаков Степан Петрович

    Гольдштейн Владимир Дмитриевич

    Кирсанов Петр Николаевич

];

Как вариант не подходит?

Anonymous
Not applicable
Author

Дело в том что на реальном проекте в записи ФИО нет пробелов или других четких символов по которым можно однозначно вычленить искомое значение. т.е. вариант искать только по "маске".  

Eugeny_Ilyin
Creator II
Creator II

Но ФИО всегда начинается с Фамилии?

Eugeny_Ilyin
Creator II
Creator II

Вот такой вариант:

Штаты:

LOAD * INLINE [

    Фамилия, Должность

    Бутенко, Директор

    Гожий, Завхоз

    Стремаков, Менеджер

    Кирсанов, Маркетолог

];

inner join LOAD * INLINE [

    ФИО

    БутенкоАлександрВладимирович

    ГожийПавелАнатольевич

    СтремаковСтепанПетрович

    ГольдштейнВладимирДмитриевич

    КирсановПетрНиколаевич

];

Tmp1:

NoConcatenate

LOAD * Resident Штаты

Where Index([ФИО],[Фамилия])>0;

DROP Table Штаты;

Anonymous
Not applicable
Author

Супер! Вариант работает.

Огромная Вам благодарность Eugenyllyin!

Anna_Klimkova
Employee
Employee

Можно к значениям Должность добавить в конце редкий символ, например %.

С помощью Mapstring() сделать замену, как вы и пробовали, а потом ориентируясь на позицию % в строке отрезать лишнее.

Что-то типа left(Mapstring(...), index(Mapstring(...), '%')-1 ) .

Либо, чтобы два раза не мэппить:

Table:

Load *, left(Temp, index(Temp,'%')-1 ) as Result;

Load ФИО,

         Mapstring(...) as Temp,

       ...

from ...

Еще сверху можно навесить условие if, если нет %, то заменять на 'Прочее'.

Anonymous
Not applicable
Author

Добрый день Anna

Ваш вариант также прекрасно работает,

спасибо за ответ.