按组的SQL计数

按组的SQL计数,sql,oracle,count,Sql,Oracle,Count,我必须遵循下面的模式 Movie(mvID, title, rating, year) Director(directorID, firstname, lastname) Genre(mvID*, genre) Direct(mvID*, directorID*) 我需要知道导演指导了大多数电影,比如喜剧类型,并输出他们的详细信息,以及他们在该类型中制作了多少部电影 所以我有 SELECT Director.DirectorID, Director.FirstName, Director.La

我必须遵循下面的模式

Movie(mvID, title, rating, year)
Director(directorID, firstname, lastname)
Genre(mvID*, genre)
Direct(mvID*, directorID*)
我需要知道导演指导了大多数电影,比如喜剧类型,并输出他们的详细信息,以及他们在该类型中制作了多少部电影

所以我有

SELECT Director.DirectorID, Director.FirstName, Director.LastName, COUNT(*)
FROM Direct, Genre, Director
WHERE Direct.mvID = Genre.mvID
AND Genre.genre = 'Comedy'
AND Direct.DirectorID = Director.DirectorID
AND COUNT(*) > ALL
GROUP BY Director.DirectorID, Director.FirstName, Director.LastName
ORDER by COUNT(*) DESC

但是我得到了一个组函数不允许的错误。

下面的SQL将解决您的问题:

SELECT      Director.DirectorID, Director.FirstName, Director.LastName, COUNT(*)
FROM        Direct, Genre, Director
WHERE       Direct.mvID = Genre.mvID
AND     Genre.genre = 'Comedy'
AND     Direct.DirectorID = Director.DirectorID
AND     rownum = 1
GROUP BY    Director.DirectorID, Director.FirstName, Director.LastName
order by    COUNT(*) DESC
具体地说,这将加入表格,并统计每个导演为“喜剧”类型电影导演的电影。然后,它按计数的降序对行进行排序,并获取第一行

请注意,您有两个很多关系,因此如果您不只是在看喜剧(即,如果您在多个类型中运行此功能),您可能必须使用不同的技术(即,多个临时表或类似的虚拟聚合),以避免SQL中出现“重复计数”

另外请注意,如果两位导演拥有相同数量的此类电影,则只会返回一行。如果希望返回具有相同喜剧数量的所有导演,则必须稍微修改sql

干杯,
Noah Wollowick

我认为电影对导演有外键?使用oracle我有一个直接关系direct(mvID*,directorID*)你的结构意味着一部电影可以有多个导演和多个流派。这是正确的吗?谢谢,但是这会返回MVID为1的导演,而不是该类型中电影数量最多的导演。我已经添加了>ALL子句,但是我得到了一个错误。
select d.firstname,d.lastname,count(g.mvId)
from Director d
inner join Direct dr on d.directorId=dr.directorId
inner join Genre g on dr.mvId=g.mvId
where g.genre='comedy'
group by d.firstname
having count(g.mvId)=max(g.mvId)