2016-03-31 24 views
0

Kohort, type, stage, cohort_eval tracker adında bazı tablolarım var. Kohort masası, takımların veya grupların listesidir. Tip tablosu, bir kohorta atanabilecek değerlendirme türlerinin bir listesidir. Tip tablosunda sadece 2 tip vardır. Sahne tablosu, bir türdeki aşamaların bir listesidir (Haydi, 3 aşama olduğunu varsayalım, ancak daha fazla eklenebilir). Örneğin, Tip 1, stage1, stage2, stage3 ... vb. Olabilir. Cohort_eval_tracker, bir grubun atandığı değerlendirmelerin kaydını tutar. Bir kohort sadece bir önceki aşama tamamlandıktan sonra bir aşamaya atanabilir. Örneğin, eğer tip 1 aşama 1, 1 Ocak'ta sona erdiyse, o zaman 2 Ocak'ta 2. aşama 2'yi almak için bir grup atanabilir. Bir kohort her iki tipte de aynı anda atanabilir. Yani bir kohort tip 1 aşama 1 olarak atanırsa, tip 2 aşama 2 başlamadan önce tip 2 aşama 1 sona erdiğinde aynı zamanda tip 2 aşama 2 de alabilirler.Bir SELECT ifadesi oluşturma

Hala maksimum aşamaya kadar değerlendirmelere atanabilecek koroları döndüren bir SELECT ifadesi oluşturmak istiyorum. Eğer bir grup herhangi bir değerlendirmeyi kabul etmediyse, onların iade edilmesini isterim ya da bir kohort son aşamasına geçmezse (bu örnek için bu aşama 3'tür, fakat gelecekte daha fazla eklenebilir) o halde ben o kohortu istiyorum iade edilmek üzere.

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

Aşama:

ikisinin de tip 1 ve tip 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 tüm 3 aşamadan tamamladığı halde grubunu 1 döndürmesi nedeniyle aşağıda girişimim doğru değil

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

Kohort:

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

Tür:

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

Sizin girişimlerinizde sorun mu var? Hata? Yanlış veri döndü mü? Bir örnek beklenen çıktı gönderebilir – Matt

+0

[Ne denediniz?] (Http://mattgemmell.com/what-have-you-tried/) – Pred

+0

Bu durumda sadece ** cohort2 ** olması gerekir tüm aşamalarını tip 1 veya tip 2'de tamamlamadıkları için döndü. – mediumM

cevap

0

Sadece tek bir alt sorgu ve bağıntılı alt sorgu WHERE deyimi için gereklidir.

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

Ya tabloları birleştirme ve sahneden MAX stageID seçmek için bir bağıntılı alt sorgu kullanarak

.

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

Yanıt yok. Hiç bir açıklama yapmadan bir açıklama. – TomTom

+0

@TomTom Oldukça doğru, bana göre kötü gösteri! Güncellenmiş. – Matt