Как присоединиться к таблице, только если в результатах есть определенный параметр - PullRequest
2 голосов
/ 07 марта 2011

Мне нужно получить имя пользователя от всех пользователей, которые завершили 2 или более классов, давая следующую структуру таблицы ...

table users
===============================
user_id     |   user_name
===============================
1234            completed_two
1235            completed_cero
1236            completed_one
1237            completed_two_no_survey

table class_registration
========================================================================
reg_id  | class_id    |   class_type      |   user_id     |   attendance
========================================================================
1            1            stress                1234            1
2            1            stress                1236            1
3            2            who_cares             1234            1
4            1            stress                1235            0
5            5            nutrition             1236            1
6            9            who_cares_2           1237            1
7            10           return_of_the_care    1237            1

table surveys
==================================================================
survey_id   |  user_id   |   class_id    |      survey_type
==================================================================
1               1234            1           'Pre Workshop Survey'
2               1236            1           'Pre Workshop Survey'
3               1235            1           'Pre Workshop Survey'
4               1236            2           'Pre Workshop Survey'
5               1234            1           'Post Workshop Survey'
6               1236            2           'Post Workshop Survey'

В этом примере user_id 1234 имеет класс типа who_cares для этой посещаемостиустановлен в 1, так что это учитывается в 1 из классов.К классу стресса типа предъявляются дополнительные требования, в основном в таблице обследований должна быть проведена последующая съемка.Пользователь с user_id также посещал 2 класса, но для класса стресса опрос отсутствует.Пользователь с user_id, равным 1235, зарегистрировался для класса стресса, но не смог его посещать.

Результаты должны содержать имена пользователей complete_two и complete_two_no_survey, так как эти 2 пользователя посещали в общей сложности 2 класса, хотя пользователь 1237нет опросов.Обследования проводятся только для стресса класса-класса или питания класса-класса.

Я даже не знаю, с чего начать делать такой запрос ... Я уверен, что есть СЛУЧАЙ, в который я могу вмешаться, но яне уверен, как сделать так, чтобы только таблица стресса и питания проверялась по таблице обследований.Я подумал, что-то вроде этого, где где-то есть предложение CASE ...

SELECT users.user_name FROM class_registration
JOIN users ON users.user_id = class_registration.user_id
WHERE class_registration.attendance = 1
GROUP BY class_registration.user_id, users.user_name
HAVING COUNT(class_registration.attendance) >= 2

Опять же, мне нужно проверить таблицу опросов для опроса после семинара, если и только если class_type является стрессомили питание.

Ответы [ 2 ]

1 голос
/ 07 марта 2011
declare @users table (user_id int, user_name varchar(50))
insert into @users values 
(1234,            'completed_two'),
(1235,            'completed_cero'),
(1236,            'completed_one'),
(1237,            'completed_two_no_survey')

declare @class_registration table
(reg_id int, class_id int, class_type varchar(50), user_id int, attendance bit)
insert into @class_registration values
(1,            1,            'stress',                1234,            1),
(2,            1,            'stress',                1236,            1),
(3,            2,            'who_cares',             1234,            1),
(4,            1,            'stress',                1235,            0),
(5,            5,            'nutrition',             1236,            1),
(6,            9,            'who_cares_2',           1237,            1),
(7,            10,           'return_of_the_care',    1237,            1)

declare @surveys table
(survey_id int, user_id int, class_id int, survey_type varchar(50))
insert into @surveys values
(1,               1234,            1,           'Pre Workshop Survey'),
(2,               1236,            1,           'Pre Workshop Survey'),
(3,               1235,            1,           'Pre Workshop Survey'),
(4,               1236,            2,           'Pre Workshop Survey'),
(5,               1234,            1,           'Post Workshop Survey'),
(6,               1236,            2,           'Post Workshop Survey')


select u.user_id, u.user_name
from @users u
  inner join
    (  
      select c.user_id
      from @class_registration as c
        inner join @surveys as s
          on c.class_id = s.class_id and
             c.user_id = s.user_id
      where
        class_type in ('nutrition', 'stress') and
        survey_type = 'Post Workshop Survey' and
        attendance = 1
      union all  
      select c.user_id
      from @class_registration as c
      where
        class_type not in ('nutrition', 'stress') and
        attendance = 1
    ) as cc
    on u.user_id = cc.user_id
group by u.user_id, u.user_name
having count(*) > 1
0 голосов
/ 07 марта 2011

Надеюсь, я правильно истолковал ваш вопрос - в некоторых примерах отсутствуют действительные идентификаторы пользователей ...

select  u.user_name, 
        cr.class_type,
        count(*)
from    users                  u, 
        class_registration     cr
where   u.user_id    =    cr.user_id
and     cr.class_type in ('stress', 'nutrition')
and     cr.attendance = 1
and     user_id not in
(select user_id
from    surveys
where   user_id = u.user_id
and     class_id = cr.class_id)
having count(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...