创建SELECT语句

时间:2016-03-31 08:26:22

标签: sql sql-server visual-studio

我有一些名为cohort,type,stage,cohort_eval tracker的表。队列表是团队或组的列表。类型表是可以分配给同类群组的评估类型列表。类型表中只有两种类型。阶段表是一个类型中的阶段列表(假设有3个阶段,但可以添加更多阶段)。例如,Type 1可以包含stage1,stage2,stage3 ......等。 cohort_eval_tracker是一个表,用于跟踪已分配队列的评估。只有在前一阶段完成后,才能为同类群组分配一个阶段。例如,如果类型1阶段1在1月1日结束,那么可以指定一个队列在1月2日采用类型2阶段2。可以同时为两个类型分配同类群组。因此,如果队列被分配了类型1阶段1,他们也可以同时进行类型2阶段2,只要类型2阶段1在类型2阶段2开始之前结束。

我想创建一个SELECT语句,该语句返回仍然可以在最大阶段分配评估的同类群组。因此,如果一个队列没有进行任何评估,我希望他们返回,或者如果一个队列没有被分配到他们的最后阶段(对于这个例子,它是第3阶段,但将来可以添加更多)然后我想要那个队列被退回。我在下面的尝试是不正确的,因为即使他们已经完成了类型1和类型2中的所有3个阶段,它仍然返回队列1。

SELECT 
    cohortID, cohortName 
FROM 
    dbo.cohort 
WHERE 
    cohortID NOT IN (SELECT cohortID 
                     FROM cohort_eval_tracker 
                     WHERE stageID = (SELECT MAX(stageID) FROM stage) 
                       AND endDate < GETDATE()) 
    OR 
    cohortID NOT IN (SELECT cohortID  
                     FROM cohort_eval_tracker 
                     WHERE stageID = 2 AND (typeID = 1 OR typeID = 2))

Cohort_eval_tracker:

╔══════════════╦══════════╦════════╦═════════╦═══════════╦═══════════╗
║ cohortEvalID ║ cohortID ║ typeID ║ stageID ║ startDate ║  endDate  ║
╠══════════════╬══════════╬════════╬═════════╬═══════════╬═══════════╣
║            1 ║        1 ║      1 ║       1 ║ 1/10/2015 ║ 1/11/2015 ║
║            2 ║        1 ║      1 ║       2 ║ 1/12/2015 ║ 1/22/2015 ║
║            3 ║        1 ║      1 ║       3 ║ 1/30/2015 ║ 2/1/2015  ║
║            4 ║        1 ║      2 ║       1 ║ 1/2/2015  ║ 1/3/2015  ║
║            5 ║        1 ║      2 ║       2 ║ 1/4/2015  ║ 1/5/2015  ║
║            6 ║        1 ║      2 ║       3 ║ 1/6/2015  ║ 1/7/2015  ║
║            6 ║        2 ║      1 ║       2 ║ 3/10/2016 ║ 3/16/2016 ║
╚══════════════╩══════════╩════════╩═════════╩═══════════╩═══════════╝

阶段:

╔═════════╦═══════════╗
║ stageID ║ stageName ║
╠═════════╬═══════════╣
║       1 ║ stage1    ║
║       2 ║ stage2    ║
║       3 ║ stage3    ║
╚═════════╩═══════════╝

队列:

╔══════════╦════════════╗
║ cohortID ║ cohortName ║
╠══════════╬════════════╣
║        1 ║ cohort1    ║
║        2 ║ cohort2    ║
╚══════════╩════════════╝

类型:

╔════════╦══════════╗
║ typeID ║ typeName ║
╠════════╬══════════╣
║      1 ║ type1    ║
║      2 ║ type2    ║
╚════════╩══════════╝

1 个答案:

答案 0 :(得分:0)

WHERE语句只需要一个子查询和一个相关的子查询。

SELECT cohortID, cohortName 
FROM dbo.cohort 
WHERE cohortID NOT IN (SELECT cohortID 
                       FROM cohort_eval_tracker 
                       WHERE (stageID = (SELECT MAX(stageID) 
                                         FROM stage) 
                       AND endDate < GETDATE())
                       OR (stageID = 2 
                       AND (typeID = 1 OR typeID = 2)))

或者通过加入表格并使用相关的子查询从舞台中选择MAX stageID。

SELECT c.cohortID, c.cohortName 
FROM dbo.cohort c
INNER JOIN cohort_eval_tracker cet ON c.cohortID = cet.cohortID
WHERE (cet.stageID = (SELECT MAX(stageID) FROM stage) AND cet.endDate < GETDATE())
OR (cet.stageID = 2 AND (cet.typeID = 1 OR cet.typeID = 2))