【问题标题】:AVG in SQL ServerSQL Server 中的 AVG
【发布时间】:2021-03-19 22:32:45
【问题描述】:

我正在学习 SQL Server,我有一个从同事那里得到的示例数据库。

我之前创建了一个运行良好的存储过程。现在我正在尝试显示我目前正在努力的列的平均值。

您的支持意义重大,我会从中学习。

所以这是我的查询:

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

我的桌子是这样的

    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

现在我想根据名称和技术列显示平均评级,这样我的表格应该像

Name    Techno     Rating    
--------------------------
A,B       C#         4.5          
B,B       JS         4          
B,C       C++        3          
B,C       C          5         

提前致谢

【问题讨论】:

  • SELECTGROUP BY 中删除其他列(例如FeedBackType),然后将Avg() 聚合函数应用于Rating
  • 重新开始 - 你正在学习坏习惯。使用 JOIN——不是 9old 式通过 where 子句连接](sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins)!
  • 别再把你的代码塞在一起了。可读的代码总是更好。

标签: sql sql-server inner-join average aggregate-functions


【解决方案1】:

您需要调整 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 Server 中,方括号中) - 或者更好的是,使用不需要引用的标识符

  • 如果rating 是整数,则需要先将其转为小数,然后再取平均值(否则会得到整数平均值)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多