繁体   English   中英

具有多个CASE语句的SQL查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM