C# 如何在ASP.NET中对数据库的一列求和以显示总评分?

C# 如何在ASP.NET中对数据库的一列求和以显示总评分?,c#,asp.net,sql,C#,Asp.net,Sql,我正在尝试建立一个评级系统。我正在使用VisualStudio。该数据库有两个表,一个表用于所有音乐曲目,另一个表包含收视率,并与FK连接 这是我的表和列 这是我当前的尝试,它给了我一个错误 SELECT DISTINCT Track.TrackId, SUM(Ratings.rating) AS average, Track.Name, Ratings.trackid FROM Track INNER JOIN Ratings ON Track.TrackId = Ratings.track

我正在尝试建立一个评级系统。我正在使用VisualStudio。该数据库有两个表,一个表用于所有音乐曲目,另一个表包含收视率,并与FK连接

这是我的表和列

这是我当前的尝试,它给了我一个错误

SELECT DISTINCT Track.TrackId, SUM(Ratings.rating) AS average, Track.Name, Ratings.trackid
FROM Track
INNER JOIN Ratings
ON Track.TrackId = Ratings.trackid
Msg 8120,16级,状态1,第1行 列“Track.TrackId”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中


每次使用sum、avr、min或max等函数时,都必须使用Group by,这是定律

您首先需要做的是按曲目对收视率求和,然后将这些收视率与您的曲目表相加,如下所示:

SELECT T.TrackId, SUM(R.rating) AS average, T.Name
FROM Track T
INNER JOIN 
(SELECT TrackId, SUM(Ratings.rating) AS average
FROM Ratings Group By TrackId ) R
ON T.TrackId = r.TrackId
SELECT Track.TrackId, AVG(1.0000 * Ratings.rating)  AS average
FROM Track
JOIN Ratings ON Track.TrackId = Ratings.trackid
Group By Track.TrackId

如果要使用聚合函数,则通常需要一个
分组依据
。如果没有分组依据,查询将只返回一行

SELECT t.TrackId, SUM(r.rating) AS average, t.Name
FROM Track t INNER JOIN
     Ratings r
     ON t.TrackId = r.trackid
GROUP BY t.TrackId, t.name;
此外,我做了以下更改:

  • 选择中删除了
    distinct
    。聚合查询几乎不需要这样做
  • 添加了作为表名缩写的表别名,以使查询更具可读性
  • select
    语句中删除了
    Ratings.TrackId
    。它是冗余的,因为它与Track.TrackId相同
  • 添加了一个
    分组依据
    语句

不要使用
distinct
。它与
groupby
的功能不同

在SQL think中,您要做的是按Trackid对所有行进行分组,并对每个组中您喜欢的评级进行平均:

SELECT T.TrackId, SUM(R.rating) AS average, T.Name
FROM Track T
INNER JOIN 
(SELECT TrackId, SUM(Ratings.rating) AS average
FROM Ratings Group By TrackId ) R
ON T.TrackId = r.TrackId
SELECT Track.TrackId, AVG(1.0000 * Ratings.rating)  AS average
FROM Track
JOIN Ratings ON Track.TrackId = Ratings.trackid
Group By Track.TrackId
但是,您同时也在尝试选择名称。在SQL中,作为GROUPBY同时执行此操作并不像您希望的那样简单。“正确”的方法类似于:

SELECT 
    Track.TrackId, 
    Average, 
    Name
FROM Track
INNER JOIN (
    SELECT TrackId, AVG(1.0000 * Ratings.rating)  AS average
    FROM Ratings 
    Group By TrackId
    ) R
ON Track.TrackId = R.trackid

为什么拍摄
Track.Name
会让人困惑?只需通过
将其添加到
组中,假设
trackid
轨道
上的主键/唯一键(一个非常合理的假设)。同意,我会通过t.trackid,t.name在大多数情况下这对我来说是完美的,我很感激。但是,您可能知道我将如何显示前10名的最高总和吗?您将按平均值添加
顺序desc limit 10