2017-05-30 87 views
1

我目前正在使用一些数据,显示所有在诊所接受过某种类型程序的患者。该程序类别由多个代码组成,每个代码代表属于该类别的更具体的程序。诊所的质量措施规定患者应在一定的时间内完成这些手术之一;问题在于,他们每个人都有不同的标准,关于他们何时可能发生以便出于质量目的进行计数。带有多个CASE语句的SQL查询

让我分解它,并希望解释它好一点。假设我们有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') 

(是的,程序代码存储为VARCHAR处理,因为在实际的数据库中某些是字母和数字)

现在,我想成为能够使用IF/THEN/ELSE逻辑来执行某些操作,这在SQL中是一种CASE语句,除非我错了),可以查看代码的类型,过程发生的服务日期以及确定是否程序用于质量目的。

实施例的伪代码:

IF ProcedureCode = 5678 
AND ServiceDate is between [GETDATE() minus 4 years] and GETDATE() 
THEN Yes 

有会是对于两个其它程序类型与各自的时限相同的语句。我希望查询只在这些情况返回true时才显示结果。

我的问题是,我知道什么我需要做的,但我的SQL是生锈的,我不知道怎么做到这一点。基本上我正在寻找关于语法的提示。

+0

是否有这些服务细节的唯一ID? – scsimon

+0

@scsimon有一个访问ID字段可用于此目的,是的,虽然我没有将它包括在我的查询中 – EJF

+0

您需要查询'ServiceDetail'表吗?它的结构是什么? – gaganshera

回答

1

你并不真的需要这种情况下,只会让你的查询复杂。你可以简单地使用和/或像

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()) ... 
+0

好吧,好像这可能是更简单的选择。现在我似乎在做什么可能会成为一个非常明显的错误,但SQL Server的错误是非特定的......我继续前进并按照自己的方式尝试,但是WHERE子句的每个部分位于不同的行上。在我的每个OR下面都有一个红色的波浪曲线。意识到我需要在每行的末尾添加一个右括号。每个OR的红色波浪消失了,但是现在每个新的圆括号都有一个...... – EJF

+0

你得到的错误是什么? – gaganshera

+0

对不起,快点击回车 - 查看编辑过的评论 – EJF

1

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 
+1

在这两种情况之间缺少第二部分......'(... dateadd(...)和getdate()之间)' – scsimon

+1

哎呀,谢谢,:) – Phil

+0

没问题,但现在你错过了一个关闭每一个括号。 :) – scsimon

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() 

工作什么,或者你可以明确地使用OR运营商为您的where子句中的每一种情况下。自从您明确要求后,我给了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...