2016-09-29 51 views
6

我想組MIN()和SQL AVG()功能,即,有沒有辦法對SQL函數進行分組?

  • MIN(AVG(column_name))
  • 或類似的東西。

有沒有辦法做分組?

我嘗試這樣做:

SELECT 
     `instructer`.`dept_name`, AVG(`instructer`.`salary`) 
AS 
     MinAvgSalary 
FROM 
     `instructer` 
GROUP BY 
     `instructer`.`dept_name` 
HAVING 
     AVG(`instructer`.`salary`) = (SELECT MIN(AVG(`instructer`.`salary`)) FROM `instructer` GROUP BY `instructer`.`dept_name`) 

但MySQL表示:

1111 - 無效使用組功能

。這是我的老師表:

Enter image description here

回答

1

您可以使用子查詢

select t.dept_name, min(t.AvgSalary) AS MinAvgSalary 
from (
    SELECT 
    `instructer`.`dept_name` AS dept_name 
    , AVG(`instructer`.`salary`) AS  AvgSalary 
    FROM `instructer` 
    GROUP BY `instructer`.`dept_name`) t 
GROUP BY t.dept_name 
HAVING t.AvgSalary = min(t.AvgSalary) 
1

嘗試在最後一個查詢使用LIMIT 1

SELECT 
     `instructer`.`dept_name`, AVG(`instructer`.`salary`) 
AS 
     MinAvgSalary 
FROM 
     `instructer` 
GROUP BY 
     `instructer`.`dept_name` 
HAVING 
     AVG(`instructer`.`salary`) = 
    (SELECT AVG(`instructer`.`salary`) as AvgSalary 
     FROM `instructer` 
     GROUP BY `instructer`.`dept_name` 
     ORDER BY AvgSalary LIMIT 1) 
0

萬一別人不工作,我這樣做了很長的路要走。創建兩個平均工資表(av1,av2),用於保存每個部門的平均工資。然後在新表格(min1)中選擇av1中的最低工資。然後加入min1到av2的薪水。你會發現,有最低工資在AV2的記錄,你可以從那裏也拉部門名稱:

SELECT av2.dept_name, av2.avsal 
FROM 
(SELECT MIN(avsal) as minsal 
FROM 
(SELECT dept_name, AVG(salary) as avsal 
    FROM instructor 
    GROUP BY dept_name) av1) min1 
INNER JOIN 
(SELECT dept_name, AVG(salary) as avsal 
FROM instructor 
GROUP BY dept_name) av2 
ON min1.minsal = av2.avsal 

這裏測試:http://sqlfiddle.com/#!9/77b0ac

相關問題