我目前正在处理一些数据,显示所有在诊所接受过某种手术的患者。此程序类别由若干代码组成,每个代码代表属于该类别的更具体的程序。诊所的质量举措表明患者应在一定时间内完成其中一项手术;问题在于,每个人都有不同的标准,关于他们何时可能发生以便计入质量目的。
让我分解一下,希望能更好地解释一下。假设我们有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生锈了,我不确定如何这样做。基本上我正在寻找语法方面的技巧。
答案 0 :(得分:1)
怎么样?
app.put('api/types/:_id', function(req,res){
var id = req.params._id;
var type = req.body;
Type.updateType(id, type, {}, function(err, type){
if(err){
throw err;
}
res.json(type);
});
});
答案 1 :(得分:1)
这适用于你的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子句的每个案例明确使用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...
答案 2 :(得分:1)
你真的不需要这样的案例,它只会使你的查询变得复杂。您可以像使用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()) ...