如何在sql查询中使用SUM和COUNT

时间:2017-11-22 07:28:29

标签: mysql

我想在我的数据库中添加不同三个表的总分,并找到分数小于80的学生人数。所以我这样做了:

SELECT 
    (SELECT SUM((totalmarks / 30) * 5) AS marks1 FROM marks) +
    (SELECT SUM((totalmarks / 25) * 5) AS marks2 FROM marks2) +
    (SELECT SUM((totalmarks / 15) * 5) AS marks3 FROM marks3) AS result
HAVING COUNT((result / 300) * 50) < 80

我能够得到标记的总和,但是当我放置HAVING COUNT条件时,它什么也没有显示。有人可以告诉我如何使用COUNT获得学生人数吗?

显示错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'HAVING COUNT((结果/ 300)* 50)&gt; 80'在第11行。

感谢有人可以帮助我。

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要按学生对结果进行分组:

select studID, sum(result) * 5 as result
from (
    select studID, totalmarks / 30 as result from marks1
    union all
    select studID, totalmarks / 25 as result from marks2
    union all
    select studID, totalmarks / 15 as result from marks3
) as base
group by studID
having  ((result / 300) * 50) < 80

注意:你如何划分和乘法有点奇怪。例如,为什么不等效:

having  result < 480

如果逻辑是marks1中的最高得分为30,对于marks2 25和marks3 15,并且您希望给予三者中的每一个相等的权重,那么你确实必须像你一样划分totalmarks中的每一个。

乘以5后,这意味着结果永远不会超过5。

因此,having测试非常多余:所有结果都将低于480。

所以也许你想看看谁没有完美的分数,那么having条款应该是:

having result < 5

答案 1 :(得分:0)

使用您当前的查询,它需要一个参考表/容器来评估HAVING条件..所以,这是我建议的解决方案:

SELECT result
FROM (
    SELECT (
        SELECT SUM(( totalmarks/30 )*5) AS marks1
        FROM marks
    ) + ( 
        SELECT SUM(( totalmarks/25 )*5) AS marks2
        FROM marks2 
    ) + ( 
        SELECT SUM(( totalmarks/15 )*5) AS marks3
        FROM marks3 
    ) AS `result` 
) AS `derived`
HAVING COUNT((result / 300) * 50) < 80