【问题标题】:Sql subquery with a group by and a join on two tables具有 group by 和两个表连接的 Sql 子查询
【发布时间】: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 只不过是希望优化器以某种方式对您的输出进行排序。将排序放在您的顶级查询上,或者得到不稳定的输出。有几个答案指出您甚至不需要子查询 - 对于未来的提问者,考虑到(假设的)数据模型,这可能是正确的,但子查询聚合通常用于解决重复行问题。

标签: sql oracle join subquery aggregate


【解决方案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】:

    只需更正您的表别名,因为您似乎有两个子查询别名(TESTT)并且没有为 D 赋值。为每个表/查询引用使用一个别名调整 SQL:

    ...
    (
     SELECT ...
    ) AS T
    JOIN DEPARTMENTS D
    

    话虽如此,您甚至不需要子查询,因为使用 JOIN 的聚合查询就足够了,假设 DEPARTMENT_IDDEPARTMENTS 表中是唯一的,不会重复计算聚合。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多