我试图显示一个表中的所有行,并在一列中对结果求和/求平均值,这是 where 子句的结果。这可能没有多大意义,所以让我解释一下。
我需要显示所有员工的报告...
SELECT Employees.Name, Employees.Extension
FROM Employees;
--------------
| Name | Ext |
--------------
| Joe | 123 |
| Jane | 124 |
| John | 125 |
--------------
...并加入 PhoneCalls 表中的一些信息...
--------------------------------------------------------------
| PhoneCalls Table |
--------------------------------------------------------------
| Ext | StartTime | EndTime | Duration |
--------------------------------------------------------------
| 123 | 2010-09-05 10:54:22 | 2010-09-05 10:58:22 | 240 |
--------------------------------------------------------------
SELECT Employees.Name,
Employees.Extension,
Count(PhoneCalls.*) AS CallCount,
AVG(PhoneCalls.Duration) AS AverageCallTime,
SUM(PhoneCalls.Duration) AS TotalCallTime
FROM Employees
LEFT JOIN PhoneCalls ON Employees.Extension = PhoneCalls.Extension
GROUP BY Employees.Extension;
------------------------------------------------------------
| Name | Ext | CallCount | AverageCallTime | TotalCallTime |
------------------------------------------------------------
| Joe | 123 | 10 | 200 | 2000 |
| Jane | 124 | 20 | 250 | 5000 |
| John | 125 | 3 | 100 | 300 |
------------------------------------------------------------
现在我想过滤掉一些包含在 SUM 和 AVG 计算中的行...
WHERE PhoneCalls.StartTime BETWEEN "2010-09-12 09:30:00" AND NOW()
...理想情况下,表格看起来像这样:
------------------------------------------------------------
| Name | Ext | CallCount | AverageCallTime | TotalCallTime |
------------------------------------------------------------
| Joe | 123 | 5 | 200 | 1000 |
| Jane | 124 | 10 | 250 | 2500 |
| John | 125 | 0 | 0 | 0 |
------------------------------------------------------------
请注意,John 在此日期范围内没有调用任何电话,因此他的总 CallCount 为零,但他仍在结果列表中。我似乎无法弄清楚如何在列表中保留像 John 这样的记录。当我添加 WHERE 子句时,这些记录将被过滤掉。
我如何创建一个 select 语句来显示所有 Employees 并且仅显示从 WHERE 子句返回的值的 SUM/AVG?
最佳答案
使用:
SELECT e.Name,
e.Extension,
Count(pc.*) AS CallCount,
AVG(pc.Duration) AS AverageCallTime,
SUM(pc.Duration) AS TotalCallTime
FROM Employees e
LEFT JOIN PhoneCalls pc ON pc.extension = e.extension
AND pc.StartTime BETWEEN "2010-09-12 09:30:00" AND NOW()
GROUP BY e.Name, e.Extension
问题是在使用 OUTER JOIN 时,在 JOIN 部分中指定条件在 JOIN 发生之前应用——就像派生表或内联 View 。 WHERE
子句在 OUTER JOIN 之后应用,这就是为什么当您在要进行 LEFT OUTER JOIN 的表上指定 WHERE 子句时,您仍然希望看到的行被过滤掉的原因。
关于sql - MySQL:如何从一个表中选择和显示所有行,并计算另一个表上的where子句的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917595/