SQL SUM和CASE以及DISTINCT

时间:2011-06-30 15:01:48

标签: sql sql-server-2005

我一直试图重新做这个陈述,但无济于事。

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时,它似乎给出了重复。在浏览之后,我注意到活动表中有12个ChildID,原因是这些孩子被绑定到多个活动。我尝试过使用类似的东西:

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

然而它在Males专栏下只返了1。任何帮助,将不胜感激。只是为了进一步澄清,表格通过ChildID键入在一起,我只需要帮助确保我返回正确的信息。如果这个问题得到解决,那么我的大量清单将会得到解决。因为我有很多数据,所以首选避免使用GROUP BY。

2 个答案:

答案 0 :(得分:16)

这会有用吗?

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

我怀疑有更好的方法来进行整体连接,但我不知道更多关于我真正不知道的架构。

答案 1 :(得分:0)

您没有显示源数据,但我愿意打赌每个程序每人有多行。

GROUP BY Program聚合每个程序,但如果说John Smith有两行带有该程序ID,他将被计为MALE两次。

请告诉我们您的表格结构,以便我们为您提供更清晰的查询。理想情况下,您会在GROUP BY之类的Person_ID上使用{{1}}从子选项中获取计数,这样您就不会获得重复计数。