我试图从查询中计算一些结果。我已经浏览了这里的各种示例,但没有一个能够适应,足以做我想做的事情。
如果有人可以看一看,指出我出错的地方,并且好心地让我摆脱困境,这将是美妙的。感谢信。
四个表:区域,部门,系统和支票
每个区域都有很多部门。每个部门都有很多系统;每个系统都有很多支票。我试图找出在前一周检查了多少不同的系统(按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检查。
如果有人能说清楚......请做!
提前感谢您的帮助!
答案 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的计数。