2016-09-29 50 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

相关问题