Access. Запрос SQL. мужчины и женщины, как их сравнить

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Андрей гость
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 21.09.2005 (Ср) 21:11

Access. Запрос SQL. мужчины и женщины, как их сравнить

Сообщение Андрей гость » 31.10.2005 (Пн) 0:04

Есть таблица в которой записаны люди (допустим студенты) в которой находятся как мужчины так и женщины. Допустим нам необходимо найти однофамильцев независимо от пола. Нам нужен запрос на выборку одинаковых записей по фамилии. Вопрос, как сделать чтобы фамилии женского и мужского рода сравнивались как одинаковые (Сурков – Суркова, Сурковский – Сурковская, Швыдкой - Швыдкая)
Ученье свет, а не ученых тьма!

Grimm
Новичок
Новичок
Аватара пользователя
 
Сообщения: 43
Зарегистрирован: 24.10.2005 (Пн) 0:17

Сообщение Grimm » 31.10.2005 (Пн) 0:24

Нужно проанализировать все возможные варианты окончаний, занести, например, в 2 массива - женские и мужские, потом перебирая записи, выделять n-нное количество последних букв и сверять с массивами.
Я слишком рано стал ребенком

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.10.2005 (Пн) 8:36

Завести в таблице дополнительный столбец, в котором будет фамилия в мужском роде (независимо от пола) и сверять по нему.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.10.2005 (Пн) 9:50

alibek писал(а):Завести в таблице дополнительный столбец, в котором будет фамилия в мужском роде (независимо от пола) и сверять по нему.


Да брось - кто-же будет этот столбец заполнять?

Вообще женская фамилия от мужской отличается тем что заканчивается на а (или вообще ничем не отличается). Ну и пользуемся этим на всю катушку:

Код: Выделить всё
SELECT Фамилия=CASE WHEN RIGHT(Фамилия,1)='а'
               THEN LEFT(Фамилия, LEN(Фамилия)-1)
               ELSE Фамилия END,
      [Кол-во]=COUNT(*)
   FROM _Test
   GROUP BY CASE WHEN RIGHT(Фамилия,1)='а'
            THEN LEFT(Фамилия, LEN(Фамилия)-1)
            ELSE Фамилия END
   ORDER BY 1
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.10.2005 (Пн) 10:02

Andrey Fedorov, заполнять его может программа.
А отличие далеко не только в этом.
Пример: Жириновский/ая. Я как-то делал процедуру, которая умела склонять слова, окончаний, на которые надо было обращать внимание, было не меньше четырех.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.10.2005 (Пн) 10:33

alibek писал(а):Andrey Fedorov, заполнять его может программа.
А отличие далеко не только в этом.
Пример: Жириновский/ая. Я как-то делал процедуру, которая умела склонять слова, окончаний, на которые надо было обращать внимание, было не меньше четырех.


Все это можно делать и в запросе. Последний вариант приведен в конце письма.

Правда на автомате вычислить точную мужскую фамилию по женской на 100% невозможно. И, похоже, разные мужские могут иметь одну и ту-же женскую (те-же Швыдкой и Швыдкий могут иметь жену Швыдкая). Кое что (но и то не все) можно было бы разрулить справочником соответствий мужская/женская, но вряд ли кому нужна такая точность - все-же таких фамилий у нас не столь и много. В общем, подобный запрос охватит большую часть:

Код: Выделить всё
SELECT Фамилия=CASE WHEN RIGHT(Фамилия,1)='а'  THEN LEFT(Фамилия, LEN(Фамилия)-1)
                    WHEN RIGHT(Фамилия,2)='ая'
                        OR RIGHT(Фамилия,2)='ой'
                        OR RIGHT(Фамилия,2)='ий'
                            THEN LEFT(Фамилия, LEN(Фамилия)-2)+'ий(ой)'
                    ELSE Фамилия END,
       [Кол-во]=COUNT(*)
    FROM _Test
    GROUP BY CASE WHEN RIGHT(Фамилия,1)='а'  THEN LEFT(Фамилия, LEN(Фамилия)-1)
                    WHEN RIGHT(Фамилия,2)='ая'
                        OR RIGHT(Фамилия,2)='ой'
                        OR RIGHT(Фамилия,2)='ий'
                            THEN LEFT(Фамилия, LEN(Фамилия)-2)+'ий(ой)'
                  ELSE Фамилия END
    ORDER BY 1
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.10.2005 (Пн) 10:49

Этот запрос даст сбой на несклоняющихся фамилиях, оканчивающихся на "а" (Веревка, например, есть у меня в справочнике такая фамилия).
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.10.2005 (Пн) 11:05

alibek писал(а):Этот запрос даст сбой на несклоняющихся фамилиях, оканчивающихся на "а" (Веревка, например, есть у меня в справочнике такая фамилия).


Ну я же говорил что подобным образом невозможно определить на 100%.
Если только ручками для подобных фамилий вбивать ее мужской аналог, как ты предлагал. Но вряд ли это кто-то будет это делать в реальной жизни ибо для работы это просто не нужно. Это-же чисто статистический запрос - как правило из чистого интереса посмотреть сколько каких фамилий в базе - явно что Веревок там будет дюже мало...

P.S Я знал семейную пару (жэто были друзья моих родителей): он - Сук, она - Береза. Почему-то она его фамилию брать не стала (и дочь тоже записала на свою) :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 1

    TopList