2011-02-24 136 views
0

我有三個相關的表計算值:SQL查詢基於條件

Evaluations: 
EvalID 
WorktypeID 
PointsPossible 

Items: 
EvalID 
ItemID 
Value 
QuestionID 

Question_Worktype: 
WorkTypeID 
QuestionID 
Points 

有每個評估多個項目,每個項目都有一個QuestionID/WorkTypeID一對涉及Question_Worktype,如果一個條目得分在於。

Items.Value是項目是否正確。

我想查詢返回的所有項目的總點數爲評價點止被授予如果該項目的值爲1

我的目標是獲得:

Eval_ID, Total Points (calculated), Points Possible 

我似乎無法包圍我的大腦。

編輯:我忘了一個重要的部分:

我有一個額外的表:

qa_edits: 
EditID 
ItemID 
NewValue 
Date 

如果有人編輯值,它存放在這裏,我真的需要它來計算基於如果有最新的項目編輯,或者項目值沒有。

回答

1

開始你的編輯表,讓每個項目的最新編輯:

SELECT 
    M.ItemId, 
    COALESCE(Q.Value, I.Value) as Value, 
    I.QuestionId 
FROM (
    SELECT 
     I.ItemId, 
     MAX(Date) as LastEditDate 
    FROM Items as I 
    LEFT OUTER JOIN QA_Edits as E ON 
     I.ItemId = E.ItemId 
    GROUP BY 
     I.ItemId 
) as M 
LEFT OUTER JOIN QA_Edits as Q ON 
    M.ItemId = Q.ItemId 
    AND M.LastEditDate = Q.Date 
LEFT OUTER JOIN Items as I ON 
    M.ItemId = Q.ItemId 
    AND M.LastEditDate IS NULL 

我建議一個視圖,而且 - 我們姑且稱之爲它LatestItems

然後,回Blorgbeard's

select 
    e.Eval_ID, 
    sum(qw.Points) as TotalPoints, 
    e.PointsPossible 
from Evaluations e 
join LatestItems i on 
    e.Eval_ID = i.Eval_ID 
    and i.Value = 1 
join Questions_WorkType qw on 
    qw.QuestionID = i.QuestionID 
group by 
    e.Eval_ID, e.PointsPossible 
1

我認爲這應該工作:

select e.Eval_ID, sum(qw.Points) as TotalPoints, e.PointsPossible 
    from Evaluations e 
    left join Items i on e.Eval_ID = i.Eval_ID and i.Value = 1 
    join Questions_WorkType qw on qw.QuestionID = i.QuestionID 
    group by e.Eval_ID, e.PointsPossible 
+0

這讓我幾乎是一路那裏(我仍然需要qwWorktype = e.worktype添加到Questions_WorkType加入)。 不幸的是,我忘了該系統的另一部分(它一直是那種一天):我有一個額外的表: 'qa_edits: EditID 項目ID 的NewValue Date' 如果有人編輯的價值,它的存儲在這裏,我真的需要它根據項目的最新編輯(如果有)來計算,或者如果沒有項目值,則計算項目值。 對不起,忘了。 – MikeL 2011-02-24 20:51:26