如何使用AVERAGE()和JOIN?

时间:2013-01-30 12:53:39

标签: sql join average

这是我的SQL语句,但我无法让它工作。谁能告诉我我做错了什么?

SELECT AVG(R.Rating), R.Track_id, T.Title, T.Artist, G.Genre, T.Track_length,    T.Track_release_date, A.Album, A.Album_release_date

FROM Track T, Genre G, Albums A
LEFT JOIN Rating ON Rating.Track_id = T.Track_id
WHERE G.Genre_id = T.Genre_id AND A.Album_id = T.Album_id AND T.Title = 'sometitle'

我或许应该告诉我,我希望得到1首曲目的平均评分。因此,如果标题的曲目编号为25,则应使用track_id 25查找每个评分,并对该选择进行平均。

2 个答案:

答案 0 :(得分:3)

在包含非聚合字段的SELECT中使用汇总函数时,您需要进行分组:

SELECT AVG(R.Rating), R.Track_id, T.Title, T.Artist, G.Genre, T.Track_length, 
    T.Track_release_date, A.Album, A.Album_release_date
FROM Track T, Genre G, Albums A
LEFT JOIN Rating R ON R.Track_id = T.Track_id
WHERE G.Genre_id = T.Genre_id 
    AND A.Album_id = T.Album_id 
    AND T.Title = 'sometitle'
GROUP BY R.Track_id, T.Title, T.Artist, G.Genre, T.Track_length, 
    T.Track_release_date, A.Album, A.Album_release_date

有关详细信息,请参阅MSDN

您必须GROUP BY SELECT中不属于聚合函数的所有列。

答案 1 :(得分:0)

假设现代DBMS支持窗口功能,以下也应该这样做

SELECT AVG(R.Rating) over (partition by r.track_id) as avg_rating, 
       R.Track_id, 
       T.Title, 
       T.Artist, 
       G.Genre, 
       T.Track_length, 
       T.Track_release_date, 
       A.Album, 
       A.Album_release_date
FROM Track T
JOIN Genre G ON G.Genre_id = T.Genre_id
JOIN Albums A ON A.Album_id = T.Album_id
LEFT JOIN Rating R ON R.Track_id = T.Track_id
WHERE T.Title = 'sometitle'