SQL分组的平均值

时间:2016-05-24 17:48:43

标签: sql sql-server average

我想让我们的学生'责任和协作任务的平均分数。问题在于责任和协作任务可以被称为不同的东西,例如"音乐协作"和#34;数学协作,但他们仍然有责任和#39;或者'合作'在他们的名字。因此,当我运行下面的查询时,我会获得与协作相关的任务的多个结果以及针对责任任务的多个结果。我需要一个平均负责和一个协作。有什么建议?我有SQL Server。

SELECT gradingscores.task AS task, 
       avg(Cast(gradingscores.score AS decimal) as averages 
FROM gradingscores 
WHERE    isnumeric(gradingscores.score) = 1
  AND    task LIKE %responsibility% 
   OR    task LIKE %collaboration%

所以我的结果如下:

任务平均值 音乐4.0的责任 数学中的责任3.5 责任n英语3.0 音乐协作3.5 艺术2.5中的合作

我希望我的结果如下:

任务平均值 责任4.0 协作3.5

评分分数也在varchar中,需要转换为数字,折扣任何非数字数据。

2 个答案:

答案 0 :(得分:0)

你应该能够按照任务的前14个字母进行分组,使用rtrim来消除协作上的额外空间(13个字母)

'其中'将确保它只能获得合作或责任的条目。

SELECT   RTRIM(LEFT(gradingscores.task, 14) AS task, 
         cast(avg(Cast(gradingscores.score AS decimal(10,1)) as decimal(10,1)) as averages 
FROM     gradingscores 
WHERE    isnumeric(gradingscores.score) = 1
  AND    task LIKE 'responsibility%' 
   OR    task LIKE 'collaboration%'
GROUP BY RTRIM(LEFT(gradingscores.task, 14)

答案 1 :(得分:0)

我意识到我只需要从Select语句中删除任务名称,并对责任和协作等级运行单独的查询。这样,它会自动将所有负责或协作的任务分组。

SELECT avg(Cast(gradingscores.score AS decimal) as averages 
FROM gradingscores 
WHERE    isnumeric(gradingscores.score) = 1
         AND task LIKE %responsibility%