【问题标题】:SQL count by groupSQL 按组计数
【发布时间】:2013-10-12 11:41:05
【问题描述】:

我必须遵循架构

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

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

【问题讨论】:

  • 我认为 Movie 对 Director 有一个外键?
  • 使用 oracle 我有直接关系 Direct(mvID*, directorID*)
  • 你的结构意味着一部电影可以有多个导演和多个类型。对吗?

标签: sql oracle count


【解决方案1】:

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

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

注意你有两个 manymany 关系,所以如果你不只是看喜剧(即,如果你跨多个流派运行),你可能不得不使用不同的技术(即多个临时表或类似的虚拟聚合),以免在您的 SQL 中出现“重复计算...

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

干杯, 诺亚沃洛维克

【讨论】:

  • 谢谢,但是这会返回具有 MVID 1 的导演,而不是该类型中电影数量最多的导演。我添加了 > ALL 子句,但出现错误。
【解决方案2】:
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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2010-10-30
    • 2010-11-30
    • 2018-09-01
    • 2013-07-23
    • 2016-08-15
    • 2018-12-29
    • 1970-01-01
    相关资源
    最近更新 更多