SQL 服务器中的平均值
AVG in SQL Server
我正在学习 SQL 服务器,我有一个从同事那里得到的示例数据库。
我之前创建了一个存储过程,它运行良好。现在我正在尝试显示我目前正在努力的列的平均值。
你们的支持意义重大,我会从中学习。
所以这是我的查询:
SELECT
CONCAT(ud.FirstName, ',', ud.LastName) AS 'Name',
tech.TechnoName AS 'Techno',
(rt.Rating) AS 'Rating', rt.FeedBackType,
rt.Description, rt.ProgramId
FROM
Rating rt, Techno tech, Program pd, User ud
WHERE
pd.Id = ud.UserID AND
pd.TechnoId = tech.TechnoID AND
rt.PdId = pd.Id
GROUP BY
pd.Id, ud.FirstName, ud.LastName, tech.TechnoName,
rt.Rating, rt.PdId, rt.Description, rt.FeedBackType
ORDER BY
rt.PdId
我的table就像
Name Techno Rating FeedbackType Description ProgramId
---------------------------------------------------------------------
A,B C# 4 1 *** 100
A,B C# 5 1 *** 102
B,B JS 4 3 *** 106
B,C C++ 3 1 *** 280
B,C C 5 1 *** 300
现在我想根据名称和技术列显示平均评分,这样我的 table 应该像
Name Techno Rating
--------------------------
A,B C# 4.5
B,B JS 4
B,C C++ 3
B,C C 5
提前致谢
您需要修改 group by
子句,为每个名称和技术生成一行,并使用聚合函数计算评分:
select
concat(ud.firstname,',',ud.lastname) as name,
tech.technoname as techno,
avg(1.0 * rt.rating) as rating
from rating rt
inner join program pd on rt.pdid = pd.id
inner join techno tech on pd.technoid = tech.technoid
inner join user ud opn pd.id = ud.userid
group by ud.firstname, ud.lastname, tech.technoname
order by ud.firstname, ud.lastname
重要提示:
使用标准联接!隐式连接(在 from
子句中使用逗号,在 where
子句中使用连接条件)是几十年前的遗留语法,应该在新代码中使用
不要使用单引号作为标识符的引号;为您的平台使用相关的引号字符(在 SQL 服务器中,方括号)——或者更好的是,使用不需要引号的标识符
如果rating
是一个整数,你需要先把它转成小数再求平均值(否则你得到的是整数平均值)
我正在学习 SQL 服务器,我有一个从同事那里得到的示例数据库。
我之前创建了一个存储过程,它运行良好。现在我正在尝试显示我目前正在努力的列的平均值。
你们的支持意义重大,我会从中学习。
所以这是我的查询:
SELECT
CONCAT(ud.FirstName, ',', ud.LastName) AS 'Name',
tech.TechnoName AS 'Techno',
(rt.Rating) AS 'Rating', rt.FeedBackType,
rt.Description, rt.ProgramId
FROM
Rating rt, Techno tech, Program pd, User ud
WHERE
pd.Id = ud.UserID AND
pd.TechnoId = tech.TechnoID AND
rt.PdId = pd.Id
GROUP BY
pd.Id, ud.FirstName, ud.LastName, tech.TechnoName,
rt.Rating, rt.PdId, rt.Description, rt.FeedBackType
ORDER BY
rt.PdId
我的table就像
Name Techno Rating FeedbackType Description ProgramId
---------------------------------------------------------------------
A,B C# 4 1 *** 100
A,B C# 5 1 *** 102
B,B JS 4 3 *** 106
B,C C++ 3 1 *** 280
B,C C 5 1 *** 300
现在我想根据名称和技术列显示平均评分,这样我的 table 应该像
Name Techno Rating
--------------------------
A,B C# 4.5
B,B JS 4
B,C C++ 3
B,C C 5
提前致谢
您需要修改 group by
子句,为每个名称和技术生成一行,并使用聚合函数计算评分:
select
concat(ud.firstname,',',ud.lastname) as name,
tech.technoname as techno,
avg(1.0 * rt.rating) as rating
from rating rt
inner join program pd on rt.pdid = pd.id
inner join techno tech on pd.technoid = tech.technoid
inner join user ud opn pd.id = ud.userid
group by ud.firstname, ud.lastname, tech.technoname
order by ud.firstname, ud.lastname
重要提示:
使用标准联接!隐式连接(在
from
子句中使用逗号,在where
子句中使用连接条件)是几十年前的遗留语法,应该在新代码中使用不要使用单引号作为标识符的引号;为您的平台使用相关的引号字符(在 SQL 服务器中,方括号)——或者更好的是,使用不需要引号的标识符
如果
rating
是一个整数,你需要先把它转成小数再求平均值(否则你得到的是整数平均值)