【问题标题】:Count function shows multiple rows with value of 1 in MySQLCount函数在MySQL中显示值为1的多行
【发布时间】:2022-09-28 22:51:05
【问题描述】:

我正在刷新关于 SQL 的知识并遇到了这个问题:


在这个 MySQL 挑战中,您的查询应该返回被报告的人的姓名(不包括空值)、向他们报告的成员数量以及这些成员的平均年龄(以整数形式)。行应按名称按字母顺序排列


这是主表:

ID  FirstName   LastName    ReportsTo       Position    Age
-----------------------------------------------------------
1   Daniel      Smith       Bob Boss        Engineer    25
2   Mike        White       Bob Boss        Contractor  22
3   Jenny       Richards    null            CEO         45
4   Robert      Black       Daniel Smith    Sales       22
5   Noah        Fritz       Jenny Richards  Assistant   30
6   David       S           Jenny Richards  Director    32
7   Ashley      Wells       David S         Assistant   25
8   Ashley      Johnson     null            Intern      25

查询应返回此结果集:

correct output

我的查询是这样的:

SELECT
    mt.ReportsTo, 
    COUNT(mt.ReportsTo) AS Members, 
    AVG(mt.Age) AS Average_Age
FROM 
    maintable_1YJ8B mt
WHERE 
    ReportsTo IS NOT NULL
GROUP BY
    mt.ReportsTo, mt.Age
ORDER BY 
    mt.ReportsTo

我的查询返回这个输出:

ReportsTo        Members    Average_Age
---------------------------------------
Bob Boss         1          22.0000
Bob Boss         1          25.0000
Daniel Smith     1          22.0000
David S          1          25.0000
Jenny Richards   1          30.0000
Jenny Richards   1          32.0000

问题:我缺少什么让它返回正确的结果集?以及如何使年龄列整数不是十进制值?

请帮忙!谢谢!

  • 如果您想要一列的 AVERAGE,那么不要也 GROUP BY 该列。
  • 谢谢!现在它可以工作了,但我需要平均值不是十进制的。结果表显示十进制数字,我该怎么做?
  • 地板、天花板、圆形或truncate。了解差异,选择能够产生预期结果的因素。
  • 请不要依赖外部链接,如果它与问题相关,请包含它这个问题。
  • 如果你想整数那为什么不投掷作为整数?

标签: mysql


【解决方案1】:

您的查询与此处的答案非常接近。正如有人已经建议的那样,不要按年龄分组。这不会让您在每个经理的员工中获得适当的平均值。我看到你的另一个问题是关于四舍五入;这可以通过“舍入”函数来完成,我们将舍入到小数点后 0 位。这是我的结果查询:

SELECT
  mt.ReportsTo, 
  COUNT(mt.ID) as Members, 
  ROUND(AVG(mt.Age), 0) as Average_Age_Rounded
FROM employee mt
  WHERE ReportsTo IS NOT NULL
  GROUP BY
    mt.ReportsTo
  ORDER BY mt.ReportsTo

这是一个答案:https://www.db-fiddle.com/f/eL36sEM4gj1KsM3pzHiAzR/0

【讨论】:

    【解决方案2】:

    您不应该按“年龄”分组 - 尝试下一个查询:

    SELECT
      mt.ReportsTo,
      COUNT(mt.ReportsTo) as Members,
      AVG(mt.Age) as Average_Age
    FROM MainTable mt
    WHERE ReportsTo IS NOT NULL
    GROUP BY mt.ReportsTo
    ORDER BY mt.ReportsTo
    

    【讨论】:

      【解决方案3】:

      请问'.mt'有什么用?

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-10
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2012-04-09
      • 1970-01-01
      相关资源
      最近更新 更多