如果成员/用户行满足value-ad-hoc查询之一,则忽略该行

blpfk2vs  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(263)

我在google上搜索了很多遍,但我认为我没有使用正确的关键字来得到我想要的结果。如果已经有人问过这个问题,请重新引导我回答这个问题。如果没有,我希望你能理解我在找什么。
一个简单的背景:我是sql语言的新手,我自学了一段时间。我在一家心理健康组织工作,他们使用的是可靠的电子健康记录。它有一个报告选项卡,我可以建立一个出口报告使用可信的“查询建设者2.0”,这是一个定制的特设。我已经能够建立一个报告,显示我的新成员名单及其主要中心没有任何问题。
现在我正在构建一个报告,它将告诉我哪些成员只有一个名为“no contact”的访问类型。我想跳过的成员,有其他访问类型,包括“没有联系”,我还没有任何成功。我用表格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”语句还是“groupby”语句?这就是我一直在努力寻找的。也许这根本不可能。

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
zqdjd7g9

zqdjd7g91#

如果某人的访问类型不是“无联系人”,您需要将其删除吗?您首先需要构建一个只有“无联系人”访问类型的用户id列表,然后将其与您的其他信息合并。
一种可能的方法是:
选择所有客户端ID
从该查询中,排除所有visittype不是“no contact”的客户端ID。
然后将结果与其他列连接起来。
比如:

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

这将选择clients中的每个client\u id,然后删除所有访问类型不是“no contact”的client行。请注意,这仍然会留下一行从未访问过的客户ID,因为他们没有非“无联系人”访问:d
(然后将上述结果与其他表/列连接起来。)
根据您使用的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 client_id from Clients
INNER JOIN VisitType
ON Clients.client_id = VisitType.client_id
WHERE VisitType.form_id = 354

(这也是错误的……):d

vptzau2j

vptzau2j2#

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

就我所知,为成员的开始日期设置日期范围会产生巨大的差异。

相关问题