具有多CASE语句的SQL查询
我目前正在处理一些数据,这些数据显示所有在诊所接受过某种手术的患者。该程序类别由多个代码组成,每个代码代表属于该类别的更具体的程序。诊所的质量倡议规定,患者应在一定的时间范围内进行这些程序之一;问题是,为了达到质量目的,每一个项目都有不同的标准来衡量何时可能发生 让我把它分解一下,希望能更好地解释一下。假设我们有3个代码,每个代码代表一种程序类型具有多CASE语句的SQL查询,sql,sql-server,sql-server-2012,case,Sql,Sql Server,Sql Server 2012,Case,我目前正在处理一些数据,这些数据显示所有在诊所接受过某种手术的患者。该程序类别由多个代码组成,每个代码代表属于该类别的更具体的程序。诊所的质量倡议规定,患者应在一定的时间范围内进行这些程序之一;问题是,为了达到质量目的,每一个项目都有不同的标准来衡量何时可能发生 让我把它分解一下,希望能更好地解释一下。假设我们有3个代码,每个代码代表一种程序类型 CODE DESCRIPTION -------------------- 1234 Basic procedure 5678 In
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')
(是的,过程代码存储为varchar,因为实际数据库中的某些代码是字母数字的)
现在,我希望能够使用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
(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子句
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()
你并不需要案例,这只会让你的查询变得复杂。你可以简单地像使用和/或
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()) ...
你并不需要案例,这只会让你的查询变得复杂。你可以简单地像使用和/或
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()) ...
这些服务详细信息是否有唯一的ID?@scsimon有一个访问ID字段可用于此目的,是的,尽管我没有将其包括在查询中。您需要查询
servicedeail
表,对吗?它的结构是什么?@gaganshera不确定你所说的结构是什么意思…?这些服务详细信息有唯一的ID吗?@scsimon有一个访问ID字段可用于此目的,是的,尽管我没有将其包括在我的查询中。你需要查询ServiceDetail
表,对吗?它的结构是什么?@gaganshera不确定你所说的结构是什么意思…?好的,是的,这可能是更简单的选择。现在我似乎犯了一个非常明显的错误,但SQL Server的错误太不具体了。。。我继续按照您的方式进行了尝试,但WHERE子句的每一部分都位于不同的行中。我的每一个眼罩下面都有一条红色的曲线。意识到我需要在每行末尾添加一个右括号。红色Swiggle在每个OR上都消失了,但现在我在每个新括号上都有了一个…您所做的最终查询是什么?您缺少每个条件的和getdate()。介于dateadd(…)和getdate())
这就是@EJF出错的原因。它与您的相同,但WHERE子句的每一行都位于不同的行上,只是为了保持一切整洁。每个OR语句看起来都像(ProcedureCode=…DATEADD(year,-1,GETDATE())
,但我会在OR的每个实例上得到语法错误,所以我在GETDATE()之后添加了额外的右括号语法错误从或转移到parenthesis@scsimon啊哈!很好的回答。我敢打赌这就是问题所在。好吧,是的,这似乎是一个更简单的选择。现在我似乎犯了一个很明显的错误,但SQL Server的错误太不具体了……我继续尝试了你的方法,但是h WHERE子句的每一部分在不同的一行上。在我的每个OR下都有一个红色的小括号。意识到我需要在每一行的末尾添加一个右括号。红色的小括号在每个OR上都消失了,但现在我在每个新的括号上都有一个。您所做的最后一个查询是什么?您缺少和getdate()对于您的每个条件,…介于dateadd(…)和getdate())
之间,这就是@EJF出错的原因。它与您的条件相同,但WHERE子句的每一行都位于不同的行上,只是为了保持一切整洁。每个OR语句看起来都像(ProcedureCode=…DATEADD(year,-1,GETDATE())
,但我会在OR的每个实例上得到语法错误,所以我在GETDATE()之后添加了额外的右括号语法错误从或转移到parenthesis@scsimon啊哈!很好的回答。我敢打赌这就是问题所在。在这两种情况下,都缺少第二部分…(…在dateadd(…)和getdate()之间)
没问题,但现在每个都缺少一个右括号。:)在这两种情况下都遗漏了第二部分(…介于dateadd(…)和getdate()之间)
没问题,但现在每个括号都缺少一个右括号。:)