Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多CASE语句的SQL查询_Sql_Sql Server_Sql Server 2012_Case - Fatal编程技术网

具有多CASE语句的SQL查询

具有多CASE语句的SQL查询,sql,sql-server,sql-server-2012,case,Sql,Sql Server,Sql Server 2012,Case,我目前正在处理一些数据,这些数据显示所有在诊所接受过某种手术的患者。该程序类别由多个代码组成,每个代码代表属于该类别的更具体的程序。诊所的质量倡议规定,患者应在一定的时间范围内进行这些程序之一;问题是,为了达到质量目的,每一个项目都有不同的标准来衡量何时可能发生 让我把它分解一下,希望能更好地解释一下。假设我们有3个代码,每个代码代表一种程序类型 CODE DESCRIPTION -------------------- 1234 Basic procedure 5678 In

我目前正在处理一些数据,这些数据显示所有在诊所接受过某种手术的患者。该程序类别由多个代码组成,每个代码代表属于该类别的更具体的程序。诊所的质量倡议规定,患者应在一定的时间范围内进行这些程序之一;问题是,为了达到质量目的,每一个项目都有不同的标准来衡量何时可能发生

让我把它分解一下,希望能更好地解释一下。假设我们有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已经生锈了,我不知道该怎么做。基本上我在寻找语法方面的技巧

怎么样

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()之间)
没问题,但现在每个括号都缺少一个右括号。:)