如何在不创建重复项的情况下计算SQL中的出现次数?

时间:2012-08-16 08:21:04

标签: sql performance tags count

我有一张包含不同导演ID的许多电影的表格,我需要计算由相同导演ID制作的电影数量以及导演姓名的数量。

我的限制是仅显示制作了5部或更多电影的导演。我有2个单独的表,一个包含电影名称和主管ID,另一个包含导演ID和主管名称。

基于在本网站上查看其他人的答案,我提出了以下查询:

Select A.Director_name, C.cnt
from M_Movie B 
    Inner Join (select Director_ID, Director_Name
    from M_Director) A on B.Director_ID = A.Director_ID
        Inner Join (select Director_ID, count(Director_id) as cnt
        from M_Movie
        group by Director_ID) C on B.Director_ID = C.Director_ID
where cnt >= 5
order by cnt desc;

上面的代码通过列出导演的名字和他们导演的电影数量,为我提供了理想的答案。 - 但继承问题......

Director Name:       Number of Movies(CNT):
"Director A" 10 "Director A" 10 "Director A" 10 "Director A" 10... (Happens 10 Times) "Director B" 8 "Director B" 8 "Director B" 8.... (Happens 8 Times) "Director C" 7

答案列出“导演A”(导演10部电影)10次,“CNT”为10次,然后列表中的下一位是“导演B”(导演8部电影)8次“CNT”为8,然后“导演C”列出7次,依此类推......

我希望有:

Director Name:       Number of Movies(CNT):
"Director A" 10 "Director B" 8 "Director C" 7
没有重复,只列出了董事的名单和他们指导的电影数量。

请帮助!

3 个答案:

答案 0 :(得分:2)

简单的答案是在查询中添加DISTINCT

Select DISTINCT A.Director_name, C.cnt

但是,您可能会重写您的查询以避免这种情况。 有点像...

Select A.Director_name, count(B.MovieID)
from M_Movie B 
    Inner Join 
    M_Director A 
        on B.Director_ID = A.Director_ID
group by a.Director_Name
having count(b.MovieID) >=5 
order by count(b.MovieID)  desc;

答案 1 :(得分:0)

你可以这样做:

SELECT Director_Name, COUNT(*) as [Count]
FROM M_Movie m
JOIN M_Director d on m.Director_ID = d.Director_ID
GROUP BY Director_Name
HAVING COUNT(*) >= 5

HAVING在分组后运行,因此您可以使用它来过滤记录数。

答案 2 :(得分:0)

因此,您基本上有两种选择:使用DISTINCT关键字或使用GROUP BY Director_name和HAVING COUNT(*)DISTINCT关键字指定从结果集中删除重复行。 最终结果将相同,但使用GROUP BY代替DISTINCT时效果会更好。