我的数据库图表......
https://s13.postimg.org/4rqz9purr/image.jpg
我需要列出每位官员的姓名,他们报告的人数超过了官员报告的平均犯罪数量。
这是我的SQL ...
SELECT
last, first
FROM
officers
JOIN
crime_officers USING (officer_id)
JOIN
crimes USING (crime_id)
JOIN
crime_charges USING (crime_id)
WHERE
crime_charges > ALL (SELECT AVG(COUNT(*)) FROM crime_charges);
但是,我收到此错误:
第6行" crime_charges"
上的标识符无效
答案 0 :(得分:2)
您的查询似乎已关闭。要获得每名警官(已报告犯罪)的平均犯罪数量:
SELECT COUNT(*) / COUNT(DISTINCT officer_id)
FROM crime_officers ;
要获得超过平均值的官员,请使用HAVING
条款:
select co.officer_id
from crime_officers co
group by co.officer_id
having count(*) > (select count(*) / count(distinct officer_id)
from crime_officers
);
您可以使用其他JOIN
来引入其他列。
编辑:
获得官员姓名并不是那么难:
select co.officer_id, o.last, o.first
from crime_officers co join
officers o
on co.officer_id = o.officer_id
group by co.officer_id, o.last, o.first
having count(*) > (select count(*) / count(distinct officer_id)
from crime_officers
);
答案 1 :(得分:1)
此错误的原因是,在WHERE
子句中,您使用了表名(crime_charges
)而不是单个表达式。你应该用一个表达来代替一个官员报告的犯罪数量:
WHERE number_of_crimes_reported_by_an_officer >ALL (SELECT AVG(COUNT(*)) FROM crime_charges) ;
但是深入了解你的问题,你仍然远离正确的解决方案。如果请求的结果是一组人员,则您的查询应直接浏览人员表(没有其他联接),在WHERE
子句中添加适当的条件。像这样:
SELECT last, first
FROM officers
WHERE (compute_number_of_crimes_reported_by_an_officer) >ALL (SELECT AVG(COUNT(*)) FROM crime_charges) ;
请参阅?通过这种方式,您将获得人员的列表。相反,如果您将连接添加到相关表,则不必要地增加记录数。