如果 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' 访问类型,然后将其与您的其余信息结合起来。
一种可能的方法是:
- Select全部client_ids
- 从此查询中,排除访问类型不是 'No Contact' 的所有 client_ids。
- 然后将该结果与您的其余列合并。
类似于:
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
据我所知,为成员的开始日期设置日期范围有很大的不同。
我在 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' 访问类型,然后将其与您的其余信息结合起来。
一种可能的方法是:
- Select全部client_ids
- 从此查询中,排除访问类型不是 'No Contact' 的所有 client_ids。
- 然后将该结果与您的其余列合并。
类似于:
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
据我所知,为成员的开始日期设置日期范围有很大的不同。