对2个表进行分组和计数

时间:2014-09-06 16:04:14

标签: mysql sql

我无法通过MySQL中的函数来统计计数和分组。

我需要两个表来生成摘要报告。相关表格:列是: 学生:ID,FirstName,LastName,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

可以这样做吗?

2 个答案:

答案 0 :(得分:1)

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

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`

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

也许这更像是你在寻找什么?由于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

这些应该让我们知道该去哪里。

答案 1 :(得分:1)

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和短名称,但实际上并不希望根据您所需的输出选择这些列。

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