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

Откуда:
Сообщений: 8
Добрый день.

Наверное, это простой запрос, только я застрял.
Есть "справочные" таблицы Question (QuestionID), Answer (QuestionID, AnswerID). В первой вопросы, во второй ответы к этим вопросам. Связь по QuestionID.

Есть 2 рабочие таблицы:
Filter (QuestionID поле лишнее, ввел для удобства восприятия , AnswerID, Mark {0,1})
Clients (ClientID, AnswerID, Mark {0,1})

Необходимо из Clients выбрать только те ClientID, для которых:
хотя бы один AnswerID с Mark =1 совпадает с AnswerID с Mark =1 из таблицы Filter по каждому из QuestionID в таблице Filter.

Грубо говоря, есть фильтр, в нем есть ряд ответов на вопросы, для каждого клиента есть ряд ответов на вопросы. Список вопросов может не пересекаться, может пересекаться. Если по каждому из вопросов из фильтра, есть совпадение хотя бы одного ответа у клиента, тогда берем. Если есть один вопрос, по которому совпадения нет - не берем.


Подскажите, пожалуйста, в какую сторону думать. А лучше помогите набросать, т.к., похоже, заклинило...

P.S. Возможно, не сильно понятно написал.
20 ноя 12, 15:41    [13501226]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
icprog
Member

Откуда:
Сообщений: 166
Так?
select distinct ClientID from Clients left join Filter 
on Clients.AnswerID=Filter.AnswerID and Clients.Mark=1 and Filter.Mark=1
where Filter.AnswerID is not null

Если нет, то хотелось бы посмотреть пример данных и что нужно получить.
20 ноя 12, 16:08    [13501574]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
stopkran84
Member

Откуда:
Сообщений: 8
icprog, не совсем. Пример приведу на пальцах:
Фильтр:
Вопрос____________Ответ_______Отметка
Продукция_________Шарики_______0
Продукция_________Семечки______1
Продукция_________Поросята_____0
Продукция_________Стулья_______0
Участие в акциях__ Акция №1_____1
Участи в акциях____Акция №2_____0
Участи в акциях____Акция №3_____1

Клиенты:
Клиент___Вопрос___________Ответ_______Отметка
Клиент1__Продукция________Стулья________1
Клиент1__Продукция________Семечки______1
Клиент1__Участие в акциях__Акция №1_____1
Клиент2__Продукция________Семечки______1
Клиент3__Участие в акциях__Акция №1_____1
Клиент4__Продукция________Семечки_______1
Клиент4__Участие в акциях__Акция №2_____1

На выходе должно быть хотя бы одно совпадение ответов для каждого из вопросов. Так, Клиент 1 подходит, а остальные нет. Если брать предложенный тобой запрос, то подойдут все.
20 ноя 12, 16:28    [13501785]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
stopkran84
Member

Откуда:
Сообщений: 8
stopkran84,

фуххх, вроде так будет ок:

SELECT      CountAnswers.ContactID, CountAnswers.CorrectAnswers
FROM  (SELECT     Clients.ClientID, COUNT(DISTINCT Filter.QuestionID) AS CorrectAnswers
                        FROM Clients INNER JOIN
                              Filter ON Clients.AnswerID = Filter.AnswerID AND Clients.Mark = 1 AND 
                              Filter.Mark = 1 GROUP BY ContactProfileAnswer.ContactID) CountAnswers 
INNER JOIN
                            (SELECT      COUNT(DISTINCT QuestionID) AS NumberQuestions
                              FROM           Filter WHERE Mark = 1) AllQuestions 
ON CountAnswers.CorrectAnswers = AllQuestions.NumberQuestions
20 ноя 12, 17:07    [13502180]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
icprog
Member

Откуда:
Сообщений: 166
stopkran84,
а так
select ClientID from Clients left join Filter 
on Clients.AnswerID=Filter.AnswerID and Clients.QuestionID=Filter.QuestionID
and Clients.AnswerID=Filter.AnswerID and Clients.Mark=1 and Filter.Mark=1
where Filter.QuestionID is not null
group by ClientID
having count(distinct Clients.QuestionID)>1
20 ноя 12, 17:10    [13502199]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
aleks2
Guest
;with
AllQuestionID as (select distincе QuestionID from Filter)
select * from Clients C0
where exists(select * from Clients C1 inner join Filter F on C1.AnswerID = F.AnswerID 
               where C1.Mark =1 and F.Mark =1 and C1.ClientID = C0.ClientID
            )
      and
      not exists(SELECT QuestionID from AllQuestionID
                 except
                 select QuestionID from Clients C1 inner join Filter F on C1.AnswerID = F.AnswerID 
                   where C1.Mark =1 and F.Mark =1 and C1.ClientID = C0.ClientID
                 )
20 ноя 12, 17:19    [13502293]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
Посетитель
Member

Откуда:
Сообщений: 1249
stopkran84,

а если у клиента будет ответ с Mark = 1,а в фильтре такого не окажется?
по идее, это тоже несовпадение, однако у вас оно проигнорируется.

ПыСы: а что это за ContactProfileAnswer.ContactID в GROUP BY ?
20 ноя 12, 17:20    [13502303]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
stopkran84
Member

Откуда:
Сообщений: 8
aleks2, icprog
Спасибо, если моя хреновина работать не будет - попробую Ваши использовать.
20 ноя 12, 17:27    [13502355]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
stopkran84
Member

Откуда:
Сообщений: 8
Посетитель
stopkran84,

а если у клиента будет ответ с Mark = 1,а в фильтре такого не окажется?
по идее, это тоже несовпадение, однако у вас оно проигнорируется.

Мне надо вот так:
stopkran84
хотя бы один AnswerID с Mark =1 совпадает с AnswerID с Mark =1 из таблицы Filter по каждому из QuestionID в таблице Filter.

А наоборот - хрен бы с ним.

Посетитель
ПыСы: а что это за ContactProfileAnswer.ContactID в GROUP BY ?


Упс, это не поменял из базы, там должно быть Clients.ClientID ессно .
20 ноя 12, 17:31    [13502398]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом (совпадение хотя бы одного значения).  [new]
icprog
Member

Откуда:
Сообщений: 166
icprog,
Упс, поправка в последней строке
having count(distinct Clients.QuestionID)=(select count(distinct QuestionID) from Filter)
20 ноя 12, 19:30    [13503266]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить