簡體   English   中英

MySQL:如何從一個表中選擇和顯示所有行,並計算另一個表中where子句的總和?

[英]MySQL: How to select and display ALL rows from one table, and calculate the sum of a where clause on another table?

我正在嘗試顯示一個表中的所有行,並將結果SUM / AVG放在一列中,這是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子句時,這些記錄被過濾掉。

如何創建一個顯示所有Employees的select語句,並且只顯示從WHERE子句返回的值的SUMs / 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部分中的條件 - 就像派生表或內聯視圖一樣。 在OUTER JOIN之后應用WHERE子句,這就是為什么當您在表上指定WHERE子句為LEFT OUTER JOIN時,您仍希望看到的行被過濾掉的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM