【问题标题】:Grouping and counting across 2 tables跨 2 个表分组和计数
【发布时间】:2014-09-07 00:25:31
【问题描述】:

我在汇总 MySQL 中的 count 和 group by 函数时遇到了麻烦。

我需要从两张表中生成摘要报告。相关表:列是: 学生:ID,名字,姓氏,SchoolID 学校:ID、ShortName、FullName、Group、HeadCoachID

每所学校都被分配到数据库中的一个,其中三四所学校将共享一个组号。我需要计算每组学校的学生人数。 我可以统计每所学校的学生人数,并按组对学校进行排序。从那里我可以使用 Excel 来计算每组中的学生人数。但我应该可以直接从 MySQL 生成报告。

 SELECT Schools.Group,Schools.ID,Schools.ShortName,Count(Students.ID) From
 Students LEFT JOIN Schools on Students.SchoolID=Schools.ID 
 GROUP BY SchoolID ORDER BY Schools.Group

这个命令的输出是这样的:

Group   ID  ShortName   Count(Students.ID)
 2     137  NSHA HS             21
 2     117  Great Neck North    32
 2     118  Great Neck South    30
 3     120  HANC                13
 3     114  Freeport            23
 3     126  Kellenberg          10
 3     152  Uniondale           18

我想要制作的是这个:

Group   Count(Students.ID)
 2       83
 3       64

这个可以吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您似乎只想要每个Group 的计数SUM。由于您已经有了要查找的结果,因此可以将其放入内部查询中,并对这些结果进行分组/求和:

    SELECT  `Group`, SUM(`Count`)
    FROM
    (
        SELECT      Schools.Group, Schools.ID, Schools.ShortName, Count(Students.ID) As `Count` 
        From        Students 
        LEFT JOIN   Schools on Students.SchoolID=Schools.ID 
        GROUP BY    SchoolID 
    ) As X
    GROUP BY `Group`
    ORDER BY `Group`
    

    虽然,内部查询只是您的复制/粘贴 - 我想知道它是如何工作的。在您的Select 中没有列为SchoolID 的任何内容。但它应该为您指明正确的方向。

    也许这就是您想要的更多?因为从未使用过ShortName

    SELECT  `Group`, SUM(`Count`)
    FROM
    (
        SELECT      Schools.Group, Schools.ID, Count(Students.ID) As `Count` 
        From        Students 
        LEFT JOIN   Schools on Students.SchoolID=Schools.ID 
        GROUP BY    Schools.Group, Schools.ID 
    ) As X
    GROUP BY `Group`
    ORDER BY `Group`
    

    或者,甚至可能没有内部选择,直接:

    SELECT      Schools.Group, Count(Students.ID) As `Count` 
    From        Students 
    LEFT JOIN   Schools on Students.SchoolID = Schools.ID 
    GROUP BY    Schools.Group
    ORDER BY    Schools.Group
    

    这些应该可以让你知道去哪里。

    【讨论】:

    • 谢谢!我现在更好地理解内部查询。只需按Schools.GROUP 分组也可以。
    【解决方案2】:
    SELECT Schools.Group, Count(Students.ID)
      From Students
      LEFT JOIN Schools
        on Students.SchoolID = Schools.ID
     GROUP BY Schools.Group
     ORDER BY Schools.Group
    

    如果您希望每组有一行,则需要按schools.group 分组,而不是students.schoolid(您当前的分组依据)。此外,您的 SELECT 列表中有 ID 和 Shortname,但似乎实际上并不希望根据您所需的输出选择这些列。

    请注意,您可能会在其中的一行中,schools.group 为空白,并且计数表示学生表上的任何学校与学校表不匹配。如果你没有得到这样的一行,那么外连接是没有意义的,你应该使用内连接而不是左外连接。

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2013-05-29
      • 2017-05-17
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      相关资源
      最近更新 更多