按特定日期条件筛选的SQL查询

按特定日期条件筛选的SQL查询,sql,sql-server,Sql,Sql Server,按特定日期条件筛选的SQL查询 SQLServerManagementStudio V17.7 问题:我正在寻找与以下视图相关的指导,即当“允许”状态为1或“允许”状态为0时,如何选择开始日期介于定义日期范围之间的记录: 标准应该是这样的:如果接纳状态=1,那么dbo.PT\u分配.开始日期>=转介日期到ifnull dbo.PT\u接纳.终止日期到现在()否则dbo.PT\u接纳.终止日期,或者如果接纳状态=0,那么开始日期>=转介日期到ifnull dbo.PT\u接纳.前景期限到现在()e

按特定日期条件筛选的SQL查询

SQLServerManagementStudio V17.7

问题:我正在寻找与以下视图相关的指导,即当“允许”状态为1或“允许”状态为0时,如何选择开始日期介于定义日期范围之间的记录:

标准应该是这样的:如果接纳状态=1,那么dbo.PT\u分配.开始日期>=转介日期到ifnull dbo.PT\u接纳.终止日期到现在()否则dbo.PT\u接纳.终止日期,或者如果接纳状态=0,那么开始日期>=转介日期到ifnull dbo.PT\u接纳.前景期限到现在()else dbo.PT\u入学日期

我的SQL查询(视图)不包括上述问题:

SELECT dbo.RES_BASIC.RESOURCE_ID,
    dbo.PT_ADMISSION.ADMISSION_ID,
    dbo.PT_ASSIGNMENT.START_DATE,
    (CASE PT_ADMISSION.PROSPECT_ADMIT_DATE WHEN NULL THEN PT_ADMISSION.ADMIT_DATE ELSE PT_ADMISSION.PROSPECT_ADMIT_DATE END) AS REFERRAL_DATE,
    dbo.PT_ADMISSION.ADMIT_DATE,
    dbo.PT_ADMISSION.PROSPECT_ADMIT_DATE,
    dbo.PT_ADMISSION.PROSPECT_TERM_DATE,
    dbo.PT_ADMISSION.TERMINATION_DATE,
    CASE WHEN PT_ADMISSION.ADMIT_DATE IS NOT NULL THEN 1 ELSE 0 END AS ADMIT_STATUS,
    dbo.PT_BASIC.PATIENT_CODE,
    dbo.RES_BASIC.NAME_FULL
FROM dbo.PT_BASIC
INNER JOIN dbo.PT_STATUS
    ON dbo.PT_BASIC.PATIENT_ID = dbo.PT_STATUS.PATIENT_ID
INNER JOIN dbo.A_PATIENT_STATUS
    ON dbo.PT_STATUS.ADMIN_SET_ID = dbo.A_PATIENT_STATUS.ADMIN_SET_ID
        AND dbo.PT_STATUS.STATUS_CODE = dbo.A_PATIENT_STATUS.STATUS_CODE
INNER JOIN dbo.O_DATASET
    ON dbo.PT_BASIC.DATASET_ID = dbo.O_DATASET.DATASET_ID
INNER JOIN dbo.PT_ADMISSION
    ON dbo.PT_BASIC.PATIENT_ID = dbo.PT_ADMISSION.PATIENT_ID
        AND dbo.PT_STATUS.ADMISSION_ID = dbo.PT_ADMISSION.ADMISSION_ID
INNER JOIN dbo.PT_ASSIGNMENT
    ON dbo.PT_BASIC.PATIENT_ID = dbo.PT_ASSIGNMENT.PATIENT_ID
INNER JOIN dbo.A_ASSIGNMENT_TYPE
    ON dbo.PT_ASSIGNMENT.ADMIN_SET_ID = dbo.A_ASSIGNMENT_TYPE.ADMIN_SET_ID
        AND dbo.PT_ASSIGNMENT.ASSIGNMENT_TYPE = dbo.A_ASSIGNMENT_TYPE.TYPE_ID
INNER JOIN dbo.RES_BASIC
    ON dbo.PT_ASSIGNMENT.RESOURCE_ID = dbo.RES_BASIC.RESOURCE_ID
WHERE (dbo.O_DATASET.DATASET_NAME = 'XXXXXXXXXX')
    AND (dbo.A_ASSIGNMENT_TYPE.DESCRIPTION = 'REFERRING PHYSICIAN')
GROUP BY dbo.RES_BASIC.NAME_FIRST + ' ' + dbo.RES_BASIC.NAME_LAST,
    dbo.RES_BASIC.RESOURCE_ID,
    dbo.PT_ADMISSION.ADMISSION_ID,
    dbo.PT_BASIC.PATIENT_CODE,
    dbo.PT_ASSIGNMENT.START_DATE,
    dbo.PT_ADMISSION.PROSPECT_TERM_DATE,
    dbo.PT_ADMISSION.PROSPECT_ADMIT_DATE,
    dbo.PT_ADMISSION.TERMINATION_DATE,
    dbo.PT_ADMISSION.ADMIT_DATE,
    dbo.RES_BASIC.NAME_FULL

也许只需要简单的方法,编写两个具有不同需求的查询,然后进行一个联合

就可以将几乎所有的“如果”放入一个简单and OR用法的条件中

我在精神上很难解析你的“类似”部分,但给出一个通用的例子

如果是A,则是B,否则是C

可以翻译成
(A和B)或(不是A和C)


注:比尔·布拉斯基的“评论”也值得考虑。如果条件逻辑变得足够复杂,那么数据库将查询与更简单的条件联合起来的工作量就会减少。你仍然需要一个条件是<代码> a和b < /代码>,另一个是<代码>不是A和C < /代码>来适当地应用这些条件,但是你会从整体条件中简化(尤其是当你认为C)实际上是一个代码的翻译>如果D然后是其他的F < /代码> .< /P>示例数据和期望的结果。(重新创建逻辑所需的最小值)如果逻辑很难解析,并且从sql中不清楚如何对您所追求的东西进行反向工程,那么在这里将非常有帮助,因为您的
墙Server@Uueerdo我调整了标签。很好!你真的需要开始使用别名。3和4部分列名引用已经被弃用。更不用说省去了大量的打字,使你的代码更加清晰。这实际上更多的是一个评论而不是一个答案。一旦你有足够的代表,你可以留下评论。