2010-10-12 29 views
5

Tôi đang cố gắng hiển thị tất cả các hàng từ một bảng và cũng có thể SUM/AVG kết quả trong một cột, đó là kết quả của mệnh đề where. Điều đó có lẽ không có ý nghĩa nhiều, vì vậy hãy để tôi giải thích.MySQL: Cách chọn và hiển thị TẤT CẢ các hàng từ một bảng và tính tổng của mệnh đề where trên một bảng khác?

tôi cần phải hiển thị một báo cáo của tất cả các nhân viên ...

SELECT Employees.Name, Employees.Extension 
FROM Employees; 

-------------- 
| Name | Ext | 
-------------- 
| Joe | 123 | 
| Jane | 124 | 
| John | 125 | 
-------------- 

... và tham gia một số thông tin từ bảng 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  | 
------------------------------------------------------------ 

Bây giờ tôi muốn lọc ra một số hàng được bao gồm trong các tính toán SUM và AVG ...

WHERE PhoneCalls.StartTime BETWEEN "2010-09-12 09:30:00" AND NOW() 

... điều này lý tưởng sẽ dẫn đến một tab le tìm kiếm một cái gì đó như thế này:

------------------------------------------------------------ 
| Name | Ext | CallCount | AverageCallTime | TotalCallTime | 
------------------------------------------------------------ 
| Joe | 123 |  5 |  200  |  1000  | 
| Jane | 124 |  10 |  250  |  2500  | 
| John | 125 |  0 |   0  |   0  | 
------------------------------------------------------------ 

Lưu ý rằng John không thực hiện bất kỳ cuộc gọi nào trong phạm vi ngày này, vì vậy tổng số CallCount của nó bằng 0, nhưng anh vẫn nằm trong danh sách kết quả. Tôi dường như không thể tìm ra cách giữ hồ sơ như John trong danh sách. Khi tôi thêm mệnh đề WHERE, các bản ghi đó được lọc ra.

Làm cách nào để tạo một câu lệnh chọn hiển thị tất cả các Nhân viên và chỉ SUMs/AVGs các giá trị được trả lại từ mệnh đề WHERE?

Trả lời

7

Sử dụng:

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 

Vấn đề là khi sử dụng một OUTER JOIN, quy định cụ thể tiêu chí trong phần THAM GIA được áp dụng trước JOIN diễn ra - giống như một bảng hoặc inline xem nguồn gốc. Mệnh đề WHERE được áp dụng sau khi OUTER JOIN, đó là lý do tại sao khi bạn chỉ rõ mệnh đề WHERE trên bảng là LEFT OUTER JOIN'd để các hàng bạn vẫn muốn xem đang được lọc ra.

+0

hmm ... điều này dường như cung cấp cho tôi một vài kết quả khác, nhưng không phải tất cả chúng. – Andrew

+1

Không nên truy vấn GROUP BY e.extension, không phải pc.extension? Như đã nêu, không phải tất cả nhân viên không có cuộc gọi nào được nhóm lại với nhau? –

+0

@djacobson: Tôi thực sự không thích sự phụ thuộc vào [chức năng cột ẩn của MySQL] (http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html) –

Các vấn đề liên quan