【问题标题】:sql query for a certain conditionsql查询某个条件
【发布时间】:2015-02-04 10:02:29
【问题描述】:

我有一张这样的桌子:

empId empSalary empDept
1   45000   IT
2   40000   IT
3   50000   SALES
4   60000   SALES
5   75000   IT
6   80000   IT
7   25000   OPS
8   30000   OPS
9   55000   MARKETING
10  60000   MARKETING

我必须写一个查询:

select empId where empSalary  > avg(empSalary) for each  empDept

请帮忙。

【问题讨论】:

  • 您应该决定您使用的数据库并适当地标记您的问题。 MySQL 和 SQL Server 完全不同。

标签: mysql sql sql-server-2008 select group-by


【解决方案1】:

试试这个:

SELECT e.empId, e.empSalary, e.empDept  
FROM employee e 
INNER JOIN (SELECT e1.empDept, AVG(e1.empSalary) empSalary 
            FROM employee e1 
            GROUP BY e1.empDept
           ) a ON e.empDept = a.empDept AND e.empSalary > a.empSalary;

编辑

SELECT e.empDept, COUNT(DISTINCT e.empid) noOfEmployees
FROM employee e 
INNER JOIN (SELECT AVG(e1.empSalary) empSalary FROM employee e1) a ON e.empSalary > a.empSalary
GROUP BY e.empDept;

【讨论】:

  • 谢谢。它比较了每个部门的平均工资。但我需要将其与整个表进行比较,而不考虑部门,然后按每个部门的 emp 总数分组。
  • thanx.. 正是我所需要的。
【解决方案2】:

可能是带有子查询的东西,大致如下:

SELECT empID FROM TABLE t 
WHERE empSalary > (SELECT AVG(empSalary) FROM TABLE WHERE empDept = t.empDept)

但也可以通过可能表现更好的 JOIN 来完成:

SELECT empID FROM TABLE t
JOIN (SELECT empDept, AVG(empSalary) AS avgSalary FROM TABLE GROUP BY empDept) averages
ON t.empDept = averages.empDept
WHERE t.empSalary > averages.avgSalary

编辑:根据下面的第一条评论,更新后的问题要求稍有不同。以下是按部门统计的高于总体平均工资的员工人数:

SELECT empDept, count(empID) FROM
(SELECT empID, empDept from TABLE 
WHERE empSalary > (SELECT AVG(empSalary) FROM TABLE) aboveAverageEmployees
GROUP BY empDept

【讨论】:

  • 谢谢。它比较了每个部门的平均工资。但我需要将其与整个表进行比较,而不考虑部门,然后按每个部门的 emp 总数进行分组
  • 我会修改答案,但你应该修改问题。这不是你最初要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多