SQL按组计数

时间:2013-10-12 11:41:05

标签: sql oracle count

我必须遵循架构

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

但是我得到了一个不允许出错的群组功能。

2 个答案:

答案 0 :(得分:0)

下面的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

具体来说,这会加入表格,并计算每个导演为“喜剧”类型的电影指导的电影。然后它按照count的降序对行进行排序并获取第一行。

请注意,你有两个很多< - >很多关系,所以如果你不只是看喜剧(即如果你跨多个类型运行),你可能不得不使用不同的技术(即多个临时表或类似的虚拟聚合),以便不在SQL中重复计算......

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

干杯, Noah Wollowick

答案 1 :(得分:0)

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)