Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом с группировкой.  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
Добрый день.
Передо мной стала следующая элементарная задача: Вывести все компании из БД с одинаковым названием и у которых совпадает хотя-бы одно ФИО контактного лица. Задачу я решил, но мне не очень нравится то как все получилось, есть предложения более элегантного решения?
Таблицы и поля:
COMP:
COMP_ID,
COMP_NAME
CONT:
CONT_ID,
COMP_ID,
CONT.NAME -- ФИО
При этом в одной компании может быть два контакта с одним ФИО.

То что получилось у меня:
SELECT T2.[COUNT], CMP.COMP_ID, T2.COMP_NAME, T2.[CONT_NAME]
FROM (
      SELECT COUNT(T1.COMP_ID) as [COUNT], T1.COMP_NAME, T1.[CONT_NAME]
      FROM (
            SELECT DISTINCT COMP.COMP_ID, COMP.COMP_NAME, CONT.[NAME] as [CONT_NAME]
            FROM COMP
            INNER JOIN CONT on (CONT.COMP_ID = COMP.COMP_ID)
            ) T1
      GROUP BY T1.COMP_NAME, T1.[CONT_NAME]
      HAVING COUNT(T1.COMP_ID)>1 
      ) T2
INNER JOIN COMP CMP on (CMP.COMP_NAME = T2.COMP_NAME)
INNER JOIN CONT CNT on (CNT.COMP_ID = CMP.COMP_ID and CNT.[NAME] = T2.CONT_NAME) 
ORDER BY T2.[COUNT], T2.COMP_NAME, T2.[CONT_NAME]
5 окт 12, 11:04    [13272259]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с группировкой.  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
Да, забыл добавить главное надо вывести:
COMP.COMP_ID, COMP.COMP_NAME, CONT.NAME
5 окт 12, 11:08    [13272285]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с группировкой.  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Николай Н.,

+ что-то в этом духе

declare @comp table
  (
    COMP_ID int
  , COMP_NAME varchar(50)
  )
declare @cont table
  (
    CONT_ID int identity
  , COMP_ID int
  , name varchar(50)
  )

insert  into @comp
        ( COMP_ID, COMP_NAME )
values  ( 1, 'company1' )
,       ( 2, 'company2' )
,       ( 3, 'company1' )

insert  into @cont
        ( COMP_ID, name )
values  ( 1, 'AAA' )
,       ( 1, '1AAA' )
,       ( 2, '2AAA' )
,       ( 3, 'AAA' )
,       ( 1, '3AAA' )
 
select  *
from    @comp as co
inner join @cont as cn on cn.COMP_ID = co.COMP_ID
where   exists ( select 1
                 from   @comp as c
                 inner join @cont z on c.COMP_ID = z.COMP_ID
                                       and z.name = cn.name
                 where  c.COMP_NAME = co.COMP_NAME
                        and c.COMP_ID != co.COMP_ID )

5 окт 12, 11:17    [13272378]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с группировкой.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Николай Н.,

задачка элементарная, но не имеет никакого отношения к реальной жизни.
Каждая запись содержит название компании, как будто Вы не слышали о нормализации,
но самое неприятное - имя одной и той же компании могли завести разные пользователи
в разное время по-разному, вплоть до подмены русских символов английскими и наоборот,
да ещё с разным количеством разделителей и разными знаками пунктуации.
Вы их, однако, проверяете на точное равенство.
5 окт 12, 11:21    [13272428]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с группировкой.  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
denis2710,
Спасибо, очень интересно решение, только надо добавить: select DISTINCT co.*, cn.name
т.к. у одной компании может быть 2 контакта с одинаковым name.
Из минусов это решение не выведет количество дублей. Хотя это уже не сверх важно.
5 окт 12, 11:28    [13272499]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с группировкой.  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
iap
Николай Н.,

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


Это да... но, к примеру данным запросом нашел 10000 дублей уж лучше что-то чем ни чего.
Конечно это малая доля от реальных задвоений, а есть какие-то варианты поиска задвоений учитывая все приведенные вами нюансы?
5 окт 12, 12:00    [13272851]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с группировкой.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Николай Н.,

тут много раз обсуждался нечёткий поиск или нечеткое сравнение
Может, поможет.

Да! Я, кажется, сразу не въехал в Вашу структуру таблиц. Так это Вы сами виноваты - надо оформлять правильно.
Оказываеться, Вы показали две разные таблицы, а не одну.
Тогда я про нормализацию не в тему ляпнул...
5 окт 12, 12:47    [13273308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить