Пропустите строку участника / пользователя, если она соответствует одному из значений - AD HO C Query - PullRequest
0 голосов
/ 19 июня 2020

Я искал все в Google и не думаю, что использую правильное ключевое слово, чтобы получить желаемый результат. Если этот вопрос уже задавался, пожалуйста, перенаправьте меня на вопрос. Если нет, надеюсь, вы поймете, что я ищу.

Небольшая предыстория: я новичок в ie в SQL языке и некоторое время учу себя. Я работаю в психиатрической организации, и они используют медицинскую карту Credible electronici c. У него есть вкладка отчета, где я могу создать отчет об экспорте с помощью Credible «Query Builder 2.0», и это настраиваемый AD HO C. Мне удалось создать отчет, в котором без каких-либо проблем отображается список новых участников с его основным центром.

Сейчас я работаю над созданием отчета, в котором он сообщит мне, у каких участников есть только тип посещения под названием «Нет контакта». Я хочу пропустить участника, у которого есть другие типы посещений, включая «Нет контакта», и я еще не добился успеха. Я использую form_id, чтобы отфильтровать его. «354» - это тип посещения без контакта.

Мне он не нужен, чтобы показывать последнюю запись.

[client_id] | [last_name] | [first_name] | [form_id]
[ 10001   ] | [   Doe  ]  | [  John    ] | [  354  ]
[ 10001   ] | [   Doe  ]  | [  John    ] | [  445  ]
[ 10001   ] | [   Doe  ]  | [  John    ] | [  431  ]
[ 10001   ] | [   Doe  ]  | [  John    ] | [  515  ]
[ 10002   ] | [ Ghost  ]  | [  Jane    ] | [  354  ]
[ 10002   ] | [ Ghost  ]  | [  Jane    ] | [  354  ]

Результат, который я хочу видеть, - это только Джейн Призрак, потому что единственный тип посещения, который был введен во всей записи, - «Нет контакта». Я хочу, чтобы он мог пропустить Джона Доу, потому что Джон имеет более 1 разного типа посещения.

Это код, который я набрал до сих пор, я просто не знаю, какой оператор использовать, чтобы получить желаемый результат. Это оператор case или оператор Group by? это то, что я изо всех сил пытался найти. Может быть, это вообще невозможно.

Select C.client_id,
  C.last_name,
  C.first_name,
  V.form_id as form_id
From Clients C
  Left Outer Join ClientVisit CV On C.client_id = CV.client_id
  Inner Join VisitType V On CV.visittype_id = V.visittype_id
  Inner Join Forms F On F.form_id = V.form_id
Order By C.last_name,
  C.first_name

Любое руководство будет очень признательно. Если об этом уже спрашивали, заранее прошу прощения.

РЕДАКТИРОВАТЬ Чтобы добавить код обновления

Я почти получил его, но он по-прежнему показывает отличное от 354 для идентификационного номера формы. Меня устраивает нулевое значение, но мне нужно, чтобы оно вообще не отображалось, кроме 354.

Select C.client_id,
  C.last_name,
  C.first_name,
  P.program_code As prim_program
From Clients C
  Inner Join ClientPrograms CP On C.client_id = CP.client_id
  Inner Join Programs P On CP.program_id = P.program_id
Where C.client_status = 'active' And CP.primary_flag = 'true'
Except
Select CV.client_id,
  CV.clientlastname,
  CV.clientfirstname,
  P.program_code
From ClientVisit CV
  Inner Join VisitType V On CV.visittype_id = V.visittype_id
  Inner Join ClientPrograms On CV.client_id = ClientPrograms.client_id
  Inner Join Programs P On P.program_id = ClientPrograms.program_id
Where V.form_id <> 354
Order By prim_program,
  last_name,
  first_name Desc

Ответы [ 2 ]

0 голосов
/ 23 июня 2020

Возможное решение Кодекса. Все спасибо @itnAAnti за то, что дал мне то, с чего начать!

Select C.client_id,
  C.dob,
  C.last_name,
  C.first_name,
  Coalesce(C.date21, C.date14) As Start_Date,
  P.program_code As prim_program,
  C.home_phone,
  C.client_email
From Clients C
  Inner Join ClientPrograms CP On C.client_id = CP.client_id
  Inner Join Programs P On CP.program_id = P.program_id,
  VisitType V
Where Coalesce(C.date21, C.date14) Between Cast(@param1 As date) And
  Cast(@param2 As date) And C.client_status = 'active' And CP.primary_flag =
  'true'
Except
Select CV.client_id,
  C.dob,
  CV.clientlastname,
  CV.clientfirstname,
  Coalesce(C.date21, C.date14) As Start_Date,
  Programs.program_code,
  C.home_phone,
  C.client_email
From ClientVisit CV
  Inner Join VisitType V On CV.visittype_id = V.visittype_id
  Inner Join ClientPrograms On CV.client_id = ClientPrograms.client_id
  Inner Join Programs On Programs.program_id = ClientPrograms.program_id
  Inner Join Clients C On C.client_id = CV.client_id
Where V.form_id <> 354
Order By prim_program,
  last_name,
  first_name

Насколько я могу судить, установка диапазона дат для даты начала членства имеет огромное значение.

0 голосов
/ 19 июня 2020

Вам нужно удалить человека, если у него когда-либо был тип посещения, отличный от «Нет контакта»? Сначала вам нужно будет составить список user_id, у которых только имеют типы посещений «Нет контакта», а затем присоединить его к остальной информации.

Один из возможных способов - :

  1. Выбрать все client_ids
  2. Из этого запроса исключить все client_ids, у которых есть тип посещения, отличный от «Нет контакта».
  3. Затем присоедините этот результат к остальные столбцы.

Что-то вроде:

SELECT client_id from Clients
EXCEPT
SELECT client_id from VisitType
WHERE form_id <> 354

Это выберет каждый client_id в Clients, а затем удалит каждую клиентскую строку, у которой когда-либо был тип посещения, который не "Нет связи". Обратите внимание, что при этом по-прежнему останутся строки client_ids, у которых никогда не было посещения, потому что у них нет посещения без «Нет контакта». : D

(затем объедините результат вышеуказанного с остальными вашими таблицами / столбцами.)

В зависимости от SQL, который вы используете, важным оператором может быть EXCEPT , ИЛИ ГДЕ НЕ СУЩЕСТВУЕТ. Поиск в Google любого из них может направить вас на правильный путь.

Альтернативно:

SELECT client_id from Clients
WHERE NOT EXISTS
SELECT client_id from VisitType
WHERE form_id <> 354

Не делайте этого:

SELECT client_id from Clients
WHERE EXISTS
SELECT client_id from VisitType
WHERE form_id = 354

Это ошибочно выберет всех, у кого когда-либо была встреча «без контакта». Это эквивалентно:

SELECT client_id from Clients
INNER JOIN VisitType
ON Clients.client_id = VisitType.client_id
WHERE VisitType.form_id = 354

(что тоже было бы неверно ...): D

...