MySQL多个组 - 按计数

时间:2017-02-27 07:45:33

标签: mysql count group-by

我试图从查询中计算一些结果。我已经浏览了这里的各种示例,但没有一个能够适应,足以做我想做的事情。

如果有人可以看一看,指出我出错的地方,并且好心地让我摆脱困境,这将是美妙的。感谢信。

四个表:区域,部门,系统和支票

每个区域都有很多部门。每个部门都有很多系统;每个系统都有很多支票。我试图找出在前一周检查了多少不同的系统(按System_ID)。

当前查询

Select
a.Area_Name,
d.Department_Name,
s.System_ID,
s.System_Name,
c.Check_Date

from departments d

left join areas a
on a.Area_ID = d.Department_Area

left join systems s
on s.System_Department = d.Department_ID

left join checks c
on c.Check_System_ID = s.System_ID

where Week(c.Check_Date) = Week(Now())
and Year(c.Check_Date) = Year(Now())

返回以下内容:

Area_Name | Department_Name  |  System_ID   |  System_Name  |  Check_Date
Area 1      Department 1        1              System 1        2017-02-27
Area 1      Department 1        1              System 1        2017-02-27
Area 1      Department 1        2              System 2        2017-02-27
Area 1      Department 2        3              System 3        2017-02-27

我试图访问的内容将对区域,部门,系统等进行分组。显示本周检查了多少个不同系统的计数。

(我知道我还没有在查询中包含任何计数或分组...我已经故意将它们排除在外以提供上下文。我已经尽力了我可以思考的方式,但我的知识显然缺乏某处)

期望的结果

Area_Name | Department_Name  |  Count_Checks
Area 1      Department 1        2
Area 1      Department 2        1

正如您所看到的,所需的结果将两个System 1分组并将它们视为1(因为它是一个独特的系统),以显示在过去一周内,已有两个不同的系统从部门1检查,只从部门2检查。

如果有人能说清楚......请做!

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用GROUP BY并使用区域/部门的组合作为组进行汇总:

SELECT a.Area_Name,
       d.Department_Name,
       COUNT(DISTINCT s.System_ID) AS Count_Checks
FROM departments d
LEFT JOIN areas a
    ON a.Area_ID = d.Department_Area
LEFT JOIN systems s
    ON s.System_Department = d.Department_ID
LEFT JOIN checks c
    ON c.Check_System_ID = s.System_ID  AND
       WEEK(c.Check_Date) = WEEK(NOW()) AND
       YEAR(c.Check_Date) = YEAR(NOW())
GROUP BY a.Area_Name,
         d.Department_Name

查询的一部分可能并不明显,那就是用于确定Count_Checks的代码:

COUNT(DISTINCT s.System_ID)

这将为每个区/部门组计算不同系统ID值的数量。在区域1 /区域1的情况下,这将产生不同的系统计数2,而对于区域1 /区域2,这将给出仅1的计数。