2016-03-31 32 views
0

私は、コホート、タイプ、ステージ、コホート_エバンストラッカーと呼ばれるテーブルをいくつか持っています。コホートテーブルは、チームまたはグループのリストです。タイプテーブルは、コホートに割り当てることができる評価タイプのリストです。タイプテーブルには2種類しかありません。ステージテーブルは、あるタイプ内のステージのリストです(3つのステージがあるとしますが、それ以上のステージを追加できます)。たとえば、タイプ1にはステージ1、ステージ2、ステージ3などがあります。 cohort_eval_trackerは、コホートに割り当てられている評価を追跡するテーブルです。コホートは、前のステージが完了した後にのみステージに割り当てることができます。たとえば、タイプ1のステージ1が1月1日に終了した場合、コホートは1月2日にタイプ2のステージ2になるように割り当てることができます。コホートには両方のタイプを同時に割り当てることができます。コホートにタイプ1のステージ1が割り当てられている場合、タイプ2のステージ2が開始する前にタイプ2のステージ1が終了している限り、同時にタイプ2のステージ2に進むこともできます。SELECTステートメントの作成

評価を最大段階まで割り当て可能なコホートを返すSELECTステートメントを作成したいとします。コホートが評価をしていない場合、私はそれらを返却したい、あるいはコホートが最後のステージに割り当てられていない場合(この例ではステージ3ですが、将来はさらに追加することができます)、そのコホート返される。

╔══════════════╦══════════╦════════╦═════════╦═══════════╦═══════════╗ 
║ 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 ║ 
╚══════════════╩══════════╩════════╩═════════╩═══════════╩═══════════╝ 

ステージ::

彼らは両方のタイプ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内のすべての3つの段階を完了しているにもかかわらず、コホート1を返しているので、以下に私の試みは正しくありません。

╔═════════╦═══════════╗ 
║ 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 **でなければなりません戻り値:タイプ1またはタイプ2のすべてのステージを完了していないため返されました。 – mediumM

答えて

0

WHERE文には、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 (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

関連する問題