2016-03-31 5 views
0

У меня есть несколько таблиц, называемых когортами, типами, этапами, координатами cohort_eval. Когортная таблица - это список команд или групп. Таблица типов - это список типов оценок, которые могут быть назначены когорте. В таблице типов есть только 2 типа. Таблица этапов - это список этапов внутри типа (предположим, что существует 3 этапа, но можно добавить больше). Например, Тип 1 может иметь stage1, stage2, stage3 ... и т. Д. Cohort_eval_tracker - это таблица, в которой отслеживаются оценки, которым была назначена когорта. Когортам может быть назначен только этап только после завершения предыдущего этапа. Например, если 1-й этап 1-го этапа закончился 1-го января, то когорта может быть назначена для 2-го этапа 2-го этапа 2-го января. Одновременно может быть назначена когорта. Поэтому, если кому-то назначается ступень 1 первого уровня, они также могут принимать 2-й этап 2 в то же самое время, пока первый этап 1-го этапа заканчивается до начала второго этапа 2-го этапа.Создание инструкции SELECT

Я хочу создать инструкцию SELECT, которая возвращает когорты, которым все еще могут быть присвоены оценки до максимальной стадии. Поэтому, если когорта не сделала каких-либо оценок, я хочу, чтобы они были возвращены, или если когорта не была назначена на последнем этапе (для этого примера это этап 3, но больше можно добавить в будущем), тогда я хочу, чтобы эта когорта для возврата. Моя попытка ниже не является правильным, поскольку он возвращается когорту 1 несмотря на то, что они завершили все 3 этапа в обоих тип 1 и тип 2.

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

Что случилось с вашей попыткой? Ошибка? неверные данные возвращены? Можете ли вы опубликовать образец ожидаемого результата – Matt

+0

[Что вы пробовали?] (Http://mattgemmell.com/what-have-you-tried/) – Pred

+0

Так что для этого случая это должно быть только ** cohort2 **, которое должно быть возвращены, так как они не завершили все свои этапы ни в одном типе, ни в типе 2. – mediumM

ответ

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

Не ответ. Заявление без каких-либо объяснений. – TomTom

+0

@TomTom Совершенно верно, плохое шоу от меня! Обновлено. – Matt

Смежные вопросы