我一直试图重新做这个陈述,但无济于事。
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。
答案 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}}从子选项中获取计数,这样您就不会获得重复计数。