我是sql的新手,我遇到了错误 “WHERE的参数必须是类型boolean,而不是类型numeric”,来自以下代码
select subject_no, subject_name, class_size from Subject
where (select AVG(mark) from Grades where mark > 75)
group by subject_no
order by subject_no asc
为了帮助理解我正在尝试做的事情,列出平均分数小于75的主题
根据我的理解,虽然where参数将是布尔值,因为一个类的平均分数将高于或低于60,因此是假的,所以非常感谢帮助纠正我的理解。
答案 0 :(得分:2)
<强>被修改!强>
使用相关子查询来查找avg(等级)&lt; 75.由于没有汇总功能,因此无需GROUP BY
,而是使用DISTINCT
来删除重复项:
select distinct subject_no, subject_name, class_size
from Subject s
where (select AVG(mark) from grades g
where g.subject_no = s.subject_no) < 75
order by subject_no asc
注意,我假设subject_no
表中也有Grades
列。
答案 1 :(得分:1)
首先,如你所提到的,(select AVG(mark) from Grades where mark > 75
)的返回值不是布尔值。它正好是AVG(标记)本身。所以你实际上可以这样写:
select 1+1 from dual and the return value is 2 or select 'hello world ' from dual
并且返回值正是String hello world。
所以,如果你想要平均分数小于75的列表主题。下面的陈述应该更像是:
mark<(select AVG(mark) from Grades where mark > 75)
这将返回布尔值。 但是,你的陈述解释你的问题太难掌握了:P 我想程序员需要更多的时间来理解SQL,而不是 一开始太熟悉了。祝好运。如果你能更准确地解释你的问题......你正在寻找的答案要容易得多。
答案 2 :(得分:0)
您的查询中有更多错误 - 您必须将Grades表加入Subject Table,将条件移到select语句之外(并将>
更改为<
),最后删除{{ 1}}子句:
group by
您应该将select语句重写为此优化形式(此外,您还可以获得结果集中的平均标记):
select subject_no, subject_name, class_size from Subject
where (select AVG(mark) from Grades where Grades.subject_no = Subject.subject_no) < 75
order by subject_no asc