sql - MySQL:如何从一个表中选择和显示所有行,并计算另一个表上的where子句的总和?

标签 sql mysql database join

我试图显示一个表中的所有行,并在一列中对结果求和/求平均值,这是 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/

相关文章:

sql - Postgresql:为一个元素计算列的元素之间的时间差

mysql - 创建插入更新后的触发器

mysql - 使用 Workbench 将 Django 连接到远程 MySQL 数据库

php - Ubuntu 12.10 上的 PHP MySQL 问题

c# - 需要递归查找。 DB 与 C# GUI

sql - 如何使这个子子查询起作用?

database - 我可以在我的 wordpress 站点中使用 Contact Form DB 插件来保存和显示数据而不发送电子邮件吗

sql - 在 SQL Server 中运行查询时忽略或处理错误

mysql - 从第二个表(Mysql)中选择相应的值

mysql - 具有多个 WHERE 子句的 SQL Like 语句