GROUP BY

时间:2017-04-30 21:10:53

标签: sql-server

我必须写一个关于以下声明的查询:

  

列出所有指导50部或以上电影的导演,按照他们导演的电影数量的降序排列。退还董事'名称和每部电影的导演数量。

我写了多个版本,但我一直在收到错误。

它涉及连接。涉及的表格是:

  • Directors(directorID,名字,姓氏),
  • Movie_Directors(directorID,movieID)。

到目前为止我尝试的是:

SELECT DISTINCT 
    firstname, lastname,
    COUNT(movie_directors.directorID)
FROM 
    dbo.movie_directors
INNER JOIN 
    directors ON directors.directorID = movie_directors.directorID
GROUP BY
    firstname, lastname
HAVING 
    COUNT(movie_directors.directorID) >= 50

这是对的吗?

1 个答案:

答案 0 :(得分:0)

每当您使用GROUP BY时,任何不在聚合函数中的列都必须位于GROUP BY子句MSDN - Group By (Transact SQL)中。

原因是:GROUP通过按组中每列的唯一值集打碎记录,因此任何不在GROUP BYHAVING子句中的列都会超出了小组的目的。

因此,通过强制列的聚合函数,我们保证select语句在其结果中是有目的的...这应该是你编码的方式。

此外,COUNT()无论如何都会忽略NULL值,而ON谓词只会返回director_ID上两个表之间的匹配。 INNER JOIN不会返回null结果。

因此,请在select语句中使用COUNT(<group by colum>)。 最后,您的HAVING子句是另一个谓词,只能与GROUP BY一起使用。 MSDN - HAVING (Transact-SQL)