2011-06-30 144 views
7

我一直試圖重新做這個聲明,但無濟於事。現在SQL SUM和CASE和DISTINCT

SELECT b.Program AS Program, 
    SUM(CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males,  
    SUM(CASE WHEN a.Gender LIKE 'F%' THEN 1 ELSE NULL END) AS Females, 
    SUM(CASE WHEN e.Activity LIKE 'Arts' THEN 1 ELSE NULL END) AS Arts, 
    AVG(CASE WHEN a.Gender LIKE 'M%' THEN CAST(f.Score AS DEC(10,2)) ELSE NULL END) 
AS MalesAverage 
FROM tblChildren a 
    LEFT JOIN tblInvolvement b ON b.ChildID = a.ChildID 
    LEFT JOIN tblActivities e ON e.ChildID = b.ChildID 
    LEFT JOIN tblScores f ON f.ChildID = b.ChildID 
WHERE b.Place = 'Location' 
    AND b.Program = 'Program' 
    AND b.Year = '2009-10' 
    AND f.Assessment LIKE '%Pre%Assessment%' 
    AND e.StudentID = b.StudentID 
GROUP BY Program 

我會得到類似的結果:

Program Males Females Arts MalesAverage 
--------------------------------------- 
Program 7  5  1 50.000000 

這樣做的問題是,目前只有4男3名女,並且,當我加入tblActivites,它似乎給副本。看完後,我注意到Activities表中有12個ChildID,原因是這些Children被綁定到多個活動。我嘗試使用類似的東西:

SELECT SUM(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males 

但它只是返回1下的男性列。任何幫助,將不勝感激。爲了進一步澄清,表格通過ChildID鍵合在一起,我只需要幫助確保我返回正確的信息。如果這個問題解決了,那麼我的大量這些東西將被解決。首先避免使用GROUP BY,因爲我有很多數據。

+0

@niktrs正如下面的回答中所解釋的,仍然給出7個男性,當正確的結果應該是4. – jnewkirk

+0

檢查表和連接之間的關係。運行沒有聚合的查詢並檢查結果是否有任何奇怪的結果。 – niktrs

回答

11

這項工作?

COUNT(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN a.ChildID ELSE NULL END) AS Males 

我懷疑有更好的方法來完成整體連接,但不知道更多關於我真的不知道的模式。

+0

你到底需要知道什麼?我可以給出比我實際看到的更通用的名稱,因爲這些名稱已經是通用的而不是真正的表名。 – jnewkirk

+0

我開始,這些表的主鍵是什麼?但我認爲我給出的COUNT表達式將解決您當前的問題。 –

+0

這個工作,但我也可能需要一些AVG聚合函數的澄清,但我非常感謝你的幫助。 – jnewkirk

0

你不顯示源數據,但我敢打賭,你每個程序每人有多行。

GROUP BY Program哪個聚合每個程序,但如果說John Smith有兩個與該程序ID行,他將被計爲MALE兩次。

請向我們展示您的表格結構,以便我們可以給您一個更清晰的查詢。理想情況下,您將通過Person_ID之類的東西使用GROUP BY從子查詢中獲得計數,以便您不會重複計數。

+0

這就是我試圖避免的。然而程序不是問題。 「看完後,我注意到在活動表中有12個ChildID,原因是這些孩子被綁定到多個活動中」。正如我所說的那樣,這是一個問題,孩子一次只能綁定一項以上的活動,在具有2列的tblActivities中產生相同的ChildID。 ChildID和Activity。我想盡量避免使用GROUP BY,但如果這是不可避免的,那麼我想我可以做到這一點。 – jnewkirk