计算sql server中的平均分级

计算sql server中的平均分级,sql,sql-server,sql-server-2008,select,average,Sql,Sql Server,Sql Server 2008,Select,Average,这是我的桌子: 我想获取包含ServiceDescription“Plast”或Skills“Plast”或 属于“石膏”类别,也要计算这些供应商的平均值 注:如果没有对任何供应商进行审查,则还应提供记录 这是我的疑问: select * from UserDetails u ,VendorInCategory v ,CategoryMaster c ,Review rv where v.CategoryId=c.Id and u.Id=r.UserId and u.Id=rv

这是我的桌子:

我想获取包含ServiceDescription“Plast”或Skills“Plast”或 属于“石膏”类别,也要计算这些供应商的平均值

注:如果没有对任何供应商进行审查,则还应提供记录

这是我的疑问:

select * from UserDetails u
  ,VendorInCategory v
  ,CategoryMaster c
  ,Review rv
where v.CategoryId=c.Id 
and u.Id=r.UserId 
and u.Id=rv.VendorId  
and v.VendorId=u.Id 
and ((u.ServiceDescription like '%Plaster%' ) 
or (u.Skills like '%Plaster%') 
or (c.Name like '%Plaster%'))
以上查询中的问题是,我并没有得到那个并没有审查的供应商

但我也希望供应商不包含审查,但符合我的标准

用户详细信息:

id     Servicedescription         Skills
1        Plaster                  plaster

2        construction             construvtion

3        plaster                  plaster

4        null                     null(not vendor)

5        null                     null(not vendor)
VendorId     ServiceDescription     Skills       averagerating

1              plaster              plaster           3

3              plaster              plaster           0
回顾

id     CustomerId     Vendorid    rating

1       4                1          3

2       5                1          3
预期输出:

id     Servicedescription         Skills
1        Plaster                  plaster

2        construction             construvtion

3        plaster                  plaster

4        null                     null(not vendor)

5        null                     null(not vendor)
VendorId     ServiceDescription     Skills       averagerating

1              plaster              plaster           3

3              plaster              plaster           0
注意:最终输出应按平均评级的降序排列。请尝试以下操作:

样本数据 解决方案
使用聚合函数AVG():

试试这个:

SELECT u.id, u.ServiceDescription, u.Skills, u.fullname, u.email, AVG(ISNULL(rv.rating, 0)) averagerating
FROM UserDetails u 
INNER JOIN VendorInCategory v ON v.VendorId=u.Id 
INNER JOIN CategoryMaster c ON v.CategoryId=c.Id 
LEFT JOIN Review rv ON u.Id=rv.VendorId  
WHERE (u.ServiceDescription LIKE '%Plaster%' OR u.Skills LIKE '%Plaster%' OR 
       c.Name LIKE '%Plaster%')
GROUP BY u.id, u.ServiceDescription, u.Skills, u.fullname, u.email
ORDER BY averagerating DESC;
编辑

实现此功能的其他解决方案:

SELECT u.id, u.ServiceDescription, u.Skills, u.fullname, u.email, 
       ISNULL(rv.averagerating, 0) averagerating
FROM UserDetails u 
INNER JOIN VendorInCategory v ON v.VendorId=u.Id 
INNER JOIN CategoryMaster c ON v.CategoryId=c.Id 
LEFT JOIN (SELECT rv.VendorId, AVG(rv.rating) averagerating FROM Review rv GROUP BY rv.VendorId) rv ON u.Id=rv.VendorId  
WHERE (u.ServiceDescription LIKE '%Plaster%' OR u.Skills LIKE '%Plaster%' OR 
       c.Name LIKE '%Plaster%')
ORDER BY ISNULL(rv.averagerating, 0) DESC;

许多用户使用AVERAGE函数来计算一系列数据的平均值。但是,当你有汇总数据而不是个人回答并且需要计算平均值时,你会怎么做?(例如,在5分评级量表(如产品评级)上选择每个评级的人数。)

如何计算加权平均值

假设您希望获得每个产品的平均总体评级:

  • 对于等级1,(9)9人
  • 对于等级2,(13)十三人
  • 对于等级3,(1)一人
使用AVERAGE函数将导致平均值为7.7。当然,这没有任何意义。我们应该期望平均值在量表范围内(1到5)

为了正确计算每个问题的平均总体回答,我们需要:

  • 将选择每个评级的个人数量乘以 相应的额定值(1-5)
  • 将这些计算结果相加
  • 将结果除以对问题的回答总数
  • 例如:

        SELECT
        SUM(
        case 
            WHEN FLOOR(rating) = 1 THEN rating
            WHEN FLOOR(rating) = 2 THEN rating *2
            WHEN FLOOR(rating) = 3 THEN rating *3
            WHEN FLOOR(rating) = 4 THEN rating *4
            WHEN FLOOR(rating) = 5 THEN rating *5        
        end    
        ) / SUM(rating)
        FROM tableRatings
    

    -在ANSI-92 SQL标准中(20多年前),用正确的ANSI
    JOIN
    语法取代了老式的逗号分隔表列表样式我已经发布了样本输入和预期输出,请检查。有人能提供我的查询吗?我对此深感震惊。你可以用
    avg(r.rating)替换
    sum(s.rating)/count(r.rating)
    非常感谢您对我的帮助。非常感谢您,请继续这样帮助我。因为像您这样的人,我总是喜欢将我的问题发布在堆栈溢出上。没问题。很高兴我能帮上忙。但如果我想包括所有的用户详细信息,如全名、电子邮件等,那会怎么样?如果我想包括更多的详细信息,如全名,电子邮件,然后我必须在我的分组中包含所有该字段按子句??非常感谢你的帮助。非常感谢你,请继续这样帮助。因为像你这样的人,我总是喜欢在堆栈溢出上发布我的问题。@mariapithia,然后你必须在选择部分和分组中添加这些列,如果你是不在这些列上使用任何聚合函数,如果我想包含更多细节,比如fullname,电子邮件,然后我必须在我的group by子句中包括所有字段??你能编辑你的查询并只包括这些字段吗?因为当我包括全名时,它会给我错误,但你不认为这是合适的,因为我想在我的select子句中包括10多列