2014-09-06 62 views
0

我在通过MySQL中的函数合计计数和分组时遇到了问题。对2个表进行分组和计数

我需要从两张表中生成摘要报告。相关表格:栏目有: 学生:身份证,名字,姓氏,SchoolID 学院:ID,短名,全名,集团,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 

可以这样做?

回答

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` 

虽然,内部查询只是一个复制/粘贴你 - 我想知道它是如何工作的。 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 

这些应该给予一定的想法去哪里。

+0

谢谢!我现在更了解内部问题。只是由'Schools.GROUP'分组也很好。 – Thorn 2014-09-07 14:04:06

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 

如果你想每团体一行,而不是students.schoolid(你目前正在分组),你需要按照schools.group进行分组。您的SELECT列表中还有ID和短名称,但似乎并不希望根据您所需的输出选择这些列。

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