如果 member/user 行满足其中一个值,则省略它 - AD HOC 查询

Omit a member/user row if it meets one of the value - AD HOC Query

我在 google 中进行了全面搜索,但我认为我没有使用正确的关键字来获得所需的结果。如果已经有人问过这个问题,请将我重定向到该问题。如果没有,我希望您能够理解我在寻找什么。

快速背景知识:我是 SQL 语言的新手,我已经自学了一段时间。我在一家心理健康组织工作,他们正在使用 Credible 电子健康记录。它有一个报告选项卡,我可以在其中使用 Credible 的 "Query Builder 2.0" 构建导出报告,它是一个自定义 AD HOC。我已经能够构建一个报告,向我显示新成员列表及其主要中心,没有任何问题。

现在我正在构建一个报告,它会告诉我哪些成员只有一种名为 "No Contact" 的访问类型。我想跳过具有其他访问类型的成员,包括 "No Contact",但我还没有成功。我使用 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  ]

我想看到的结果只有Jane Ghost,因为整个记录中唯一输入的访问类型是"No Contact"我希望它能够跳过John Doe,因为John有超过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

任何指南将不胜感激。如果已经有人问过这个问题,我提前道歉。

编辑添加更新代码

我差不多明白了,但表格 ID 号仍然显示 354 以外的其他内容。我可以接受 null 值,但我需要它只显示 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

如果某人 曾经 的访问类型不是 'No Contact',您需要将其删除吗?您首先需要构建一个 user_id 的列表,其中 只有 具有 'No Contact' 访问类型,然后将其与您的其余信息结合起来。

一种可能的方法是:

  1. Select全部client_ids
  2. 从此查询中,排除访问类型不是 'No Contact' 的所有 client_ids。
  3. 然后将该结果与您的其余列合并。

类似于:

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

这将 select 每 client_id 个客户,然后删除每个曾经有过非 "No Contact" 访问类型的客户行。请注意,这仍然会留下从未访问过的 client_ids 行,因为他们没有非 "No Contact" 访问。 :D

(然后将上面的结果与其余的 tables/columns 相结合。)

根据您使用的 SQL,重要的运算符可能是 EXCEPT 或 WHERE NOT EXISTS。谷歌搜索其中任何一个可能会让你走上正确的轨道。

或者:

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 每个曾经有过 "No Contact" 约会的人。相当于:

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

(这也是错误的...):D

代码的潜在解决方案。非常感谢@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

据我所知,为成员的开始日期设置日期范围有很大的不同。