【问题标题】:SQL Average of grouping分组的 SQL 平均值
【发布时间】:2016-05-24 17:48:43
【问题描述】:

我正在尝试获取我们学生在责任和协作任务方面的平均分数。问题是责任和协作任务可以称为不同的东西,例如“音乐协作”和“数学协作”,但它们的名称中仍然有“责任”或“协作”。因此,当我运行下面的查询时,我会得到与协作相关的任务的多个结果和责任任务的多个结果。我需要一个负责责任的平均值和一个协作的平均值。有什么建议么?我有 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 中的责任 责任英语3.0 音乐合作 3.5 艺术合作 2.5

我希望我的结果看起来像:

平均任务 责任4.0 协作 3.5

评分分数也是 varchar 格式,需要转换成数字,打折任何非数字数据。

【问题讨论】:

  • 向我们展示数据库架构、示例数据和预期结果,看看您需要什么。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • 请勿使用浮点数,除非您正在执行统计抽样并了解随之而来的精度损失。 在您理解这个问题之前,始终在计算中使用小数。浮点数是一种不精确的数据类型,它使用以 2 为底的指数来表示数字,因此不能准确地表示十进制数,并且可能会产生预期为(例如)5 的值会显示为 4.99999999 的问题。

标签: sql sql-server average


【解决方案1】:

您应该能够按任务的前 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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多