[英]SQL query with multiple CASE statements
我目前正在处理一些数据,显示所有在诊所接受过某种程序的患者。 此程序类别由若干代码组成,每个代码代表属于该类别的更具体的程序。 诊所的质量举措表明患者应在一定时间内完成其中一项手术; 问题在于,每个人都有不同的标准,关于他们何时可能发生以便计入质量目的。
让我分解一下,希望能更好地解释一下。 假设我们有3个代码,每个代码代表一种程序。
CODE DESCRIPTION
--------------------
1234 Basic procedure
5678 Intermediate procedure
9012 Thorough procedure
现在,每种类型的过程都有自己的时间范围。 基本版本必须在过去一年内执行才能计算。 中间的一个可以是过去四年中的任何时间,而彻底的一个可以持续十年 。 因此,在2014年进行中间程序的患者仍然需要用于质量目的,并且在2009年完成程序的患者仍然可以计算。
我有我的基本查询:
SELECT DISTINCT
PatientID,
PatientAge,
ProcedureCode,
CodeDescription,
ServiceDate,
RenderingProvider,
VisitType
FROM ServiceDetail
WHERE ProcedureCode IN ('1234','5678','9012')
(是的,程序代码存储为varchars,因为实际数据库中的某些代码是字母数字)
现在,我希望能够使用IF / THEN / ELSE逻辑做一些事情,这可能是SQL中的CASE语句,除非我弄错了),可以查看代码类型,程序发生的服务日期,并确定该程序是否符合质量目的。
伪代码示例:
IF ProcedureCode = 5678
AND ServiceDate is between [GETDATE() minus 4 years] and GETDATE()
THEN Yes
对于其他两种过程类型,它们各自的时间帧都有相同的陈述。 我希望查询只在这些情况返回true时显示结果。
我的问题是,我知道我需要做的,但我的SQL是生锈的,我不知道该怎么做。 基本上我正在寻找语法方面的技巧。
关于什么
where
(procedureCode = '1234' AND ServiceDate
Between DATEADD(year, -1, getdate()) and getdate())
or
(procedureCode = '5678' AND ServiceDate
Between DATEADD(year, -4, getdate()) and getdate())
or
.. etc
这适用于你的where子句
WHERE
ProcedureCode IN ('1234','5678','9012')
AND VisitID IN
(select VisitID
from ServiceDetail
where ServiceDate >=
case
when ProcedureCode = 1234 then dateadd(year,-1,getdate())
when ProcedureCode = 5678 then dateadd(year,-4,getdate())
when ProcedureCode = 9012 then dateadd(year,-10,getdate())
end)
and ServiceDate <= getdate()
或者,您可以为where子句的每个case明确使用OR
运算符。 因为你明确要求,我给了CASE
表达式。
如果您选择直接方法,修复其他人的语法错误...
WHERE
(ProcedureCode = '1234' and ServiceDate Between DATEADD(year, -1, getdate()) and getdate())
OR
(ProcedureCode = '5678' and ServiceDate Between DATEADD(year, -2, getdate()) and getdate())
etc...
你真的不需要这种情况,它只会使你的查询变得复杂。 您可以像使用AND / OR一样简单地完成
SELECT DISTINCT
PatientID,
PatientAge,
ProcedureCode,
CodeDescription,
ServiceDate,
RenderingProvider,
VisitType
FROM ServiceDetail
WHERE (ProcedureCode = '1234' and ServiceDate Between getdate() AND DATEADD(year, -1, getdate()) OR
(ProcedureCode = '5678' and ServiceDate Between getdate() AND DATEADD(year, -2, getdate()) ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.