具有 group by 和两个表连接的 Sql 子查询
Posted
技术标签:
【中文标题】具有 group by 和两个表连接的 Sql 子查询【英文标题】:Sql subquery with a group by and a join on two tables 【发布时间】:2018-12-14 21:29:49 【问题描述】:所以我有两张桌子 EMPLOYEE - 包含 EMPLOYEE_NAME、DEPARTMENT_ID 和 SALARY 列 DEPARTMENTS - 包含 DEPARTMENT_NAME 和 DEPARTMENT_ID 等列
我需要显示部门名称和每个部门的平均工资,并按平均工资排序。
我是数据库新手,遇到了麻烦。 我尝试在 from 字段中执行子查询(此子查询准确返回我需要的内容减去需要我将部门表加入结果的部门名称)子查询中的所有数据都在一个表中 - 员工。而部门名称在部门表中。
这是我尝试过的。
SELECT D.DEPARTMENT_NAME, T.PERDEPT
FROM
(
SELECT DEPARTMENT_ID, AVG(SALARY) AS PERDEPT
FROM EMPLOYEE
GROUP BY DEPARTMENT_ID
ORDER BY PERDEPT
) AS TEST T
JOIN DEPARTMENTS
ON D.DEPARTMENT_ID=T.DEPARTMENT_ID;
这会返回一个
SQL 命令未正确终止
就行了AS TEST T
非常感谢任何和所有帮助 非常感谢
【问题讨论】:
命令格式不正确,没有出现换行符 只是别名表DEPARTMENTS
as D
旁注:子查询中的ORDER BY
只不过是希望优化器以某种方式对您的输出进行排序。将排序放在您的***查询上,或者得到不稳定的输出。有几个答案指出您甚至不需要子查询 - 对于未来的提问者,考虑到(假设的)数据模型,这可能是正确的,但子查询聚合通常用于解决重复行问题。
【参考方案1】:
这个查询应该满足你的要求:
select d.department_name, avg(e.salary) as avg_salary
from salary_department d
left join employee e on e.department_id = d.department_id
group by d.department_name
order by avg(e.salary)
【讨论】:
【参考方案2】:只需更正您的表别名,因为您似乎有两个子查询别名(TEST 和 T)并且没有为 D 赋值。为每个表/查询引用使用一个别名调整 SQL:
...
(
SELECT ...
) AS T
JOIN DEPARTMENTS D
话虽如此,您甚至不需要子查询,因为使用 JOIN
的聚合查询就足够了,假设 DEPARTMENT_ID 在 DEPARTMENTS 表中是唯一的,不会重复计算聚合。
SELECT D.DEPARTMENT_NAME,
AVG(E.SALARY) AS PERDEPT
FROM EMPLOYEE E
JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
GROUP BY E.DEPARTMENT_ID,
D.DEPARTMENT_NAME
ORDER BY AVG(SALARY)
【讨论】:
以上是关于具有 group by 和两个表连接的 Sql 子查询的主要内容,如果未能解决你的问题,请参考以下文章
SQL - 使用 GROUP BY 获取子查询子集中或连接中的最新记录
mysql经常使用查询:group by,左连接,子查询,having where
如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空