2013-10-22 93 views
1

我有兩個表,我需要找到已交付的驅動程序比所有驅動程序所運載的平均數量多,並且比平均值多。我顯示的第一個表是Package表,第二個表是Truck表。我知道我需要使用一個計數,但我無法弄清楚如何相結合,平均選擇值大於平均值

Truck_no 
103 
105 
102 
108 
108 
108 
101 
109 
109 
100 
100 
100 


Truck_no Drivername 
100 JONES 
101 DAVIS 
102 GOMEZ 
103 THOMPSON 
104 HERSHEY 
105 FERRIS 
106 SHAVER 
107 LEE 
108 TOPI 
109 ACKERMAN 

這是我的查詢到目前爲止

select drivername, count(package.truck_no) as PackageCount 
from PACKAGE, truck 
where truck.TRUCK_NO=PACKAGE.TRUCK_NO 
group by drivername 

和我得到這些結果

Drivername  Packagecount 
ACKERMAN 2 
DAVIS   1 
FERRIS   1 
GOMEZ   1 
JONES   3 
THOMPSON 1 
TOPI   3 

我真的很感激任何幫助。非常感謝

+1

當你使用'sum'和'count'等的時候,MySQL會出現意想不到的分組,所以在這種情況下,我會說你應該運行兩個查詢,第一個會計算平均值,第二個(主)會選擇'Packagecount> {insert average}' - 你可以用服務器端語言(PHP,ASP等)來做到這一點 –

+0

謝謝。我想過使用子查詢,但我不能採取卡車的平均數012_ – Roberto1991

+0

您能否明確地發佈您的輸入和預期產出... – Teja

回答

0
SELECT drivername, packagecount 
     FROM ( SELECT drivername, COUNT(1) AS packagecount 
       FROM truck 
      LEFT JOIN package 
         ON truck.truck_no = package.truck_no 
      GROUP BY 1) all_driver_counts 
CROSS JOIN 
      (SELECT AVG(n) AS avg_packagecount 
       FROM ( SELECT truck_no, COUNT(1) AS n 
         FROM package 
        GROUP BY 1) truck_packages) the_average 
    WHERE packagecount > avg_packagecount; 

這將產生:

+------------+--------------+ 
| drivername | packagecount | 
+------------+--------------+ 
| ACKERMAN |   2 | 
| JONES  |   3 | 
| TOPI  |   3 | 
+------------+--------------+ 

看完上面的查詢自下而上,我們計算每車(the_average)提供的平均包,並加入與每個驅動程序的計數(all_driver_counts)只過濾那些駕駛員人數超過平均值的行。

分析(SQL滑動窗口)函數可能使上述查詢更容易,但是,唉,MySQL不支持它們。

相關問題