【问题标题】:How to write SQL query for employes and department table如何编写员工和部门表的 SQL 查询
【发布时间】:2013-07-09 05:02:59
【问题描述】:

我有

employees table(id,f_name,l_name,salary,dept_id,manager_id)

departments table(id,dept_name,manager_id)

我想在单个表格中显示dept_namemanager_id、经理的l_name 以及在相应经理手下工作的员工人数。

【问题讨论】:

  • 您尝试了什么,还正确标记了问题,您尝试针对哪个数据库运行此查询?
  • 我们如何判断某人是否是经理姓氏部分的经理?我没有在部门中看到经理姓名列,也没有在员工中看到职位列,
  • 您能否提供一些示例数据,以便我测试我的查询?

标签: mysql sql-server sql-server-2008 sql-server-2005 sql-server-ce


【解决方案1】:

这是您可以考虑的另一种解决方案

SELECT D.dept_name as [Department Name],
E.manager_id as [Manager ID],
E.l_name as [Last Name],
(SELECT COUNT(*) FROM employees EM WHERE EM.manager_id = E.id) as [Employee Count]
FROM departments D
INNER JOIN employees E on D.manager_id = E.manager_id

【讨论】:

    【解决方案2】:

    您可以通过correlated subquery 来获取计数。休息你可以选择使用加入。这可能对你有帮助

     SELECT  D.dept_name,
                D.manager_id,
                E.l_name,
                (SELECT COUNT(*) 
                         FROM employees 
                         WHERE manager_id=D.manager_id) AS numberOfEmployees
     FROM   departments D INNER JOIN employees E ON D.manager_id=E.id
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT dept.dept_name, dept.manager_id, emp.l_name, emp_count.empcount 
      FROM departments AS dept 
      INNER JOIN (SELECT COUNT(*) AS empcount, manager_id FROM employees GROUP BY manager_id) AS emp_count ON dept.manager_id = emp_count.manager_id
      INNER JOIN employees AS emp ON dept.manager_id = emp.id
      

      或者这个:

      SELECT dept.dept_name, dept.manager_id, emp.l_name, emp_count.empcount 
      FROM departments AS dept 
      INNER JOIN (SELECT COUNT(*) AS empcount, dept_id FROM employees GROUP BY manager_id) AS emp_count ON dept.dept_id = emp_count.dept_id
      INNER JOIN employees AS emp ON dept.manager_id = emp.id
      

      第一个是引用manager_id,第二个是引用dept_id。两者中的任何一个都可以得到相同的结果。我通过为员工数量创建一个子查询并将其链接到部门来实现这一点。

      这是SQL Server 2008 Fiddle

      【讨论】:

      • (SELECT COUNT(*) AS empcount, dept_id FROM employees GROUP BY manager_id) 这可能会降低性能。因此 sql server 会为此选择创建临时存储。
      • 是的,但我没有说这是唯一的方法。
      • 我认为correlated subquery 在这种情况下提供了更好的性能。我说的对吗?
      • 是的,但给出相同的结果。尽管如此,我还是回答了这个问题。
      【解决方案4】:

      检查一下

          select d.deptname, d.managerid, e.fname, (select COUNT(*) 
                                                  from employees 
                                                  where managerid = d.managerid and 
                                                  managerid <> id and
                                                  depid = d.id
                                                  group by managerid) NoofEmps
      from departments d join employees e on d.managerid = e.id
      

      字段名称可能与您提到的不完全相同。

      【讨论】:

        【解决方案5】:

        您可以通过简单的查询来做到这一点,但是您可能应该删除员工表中的 manager_id 并只使用员工记录 id 作为标识符。

        Select dept.dept_name, dept.manager_id, (select e.l_name from employees as e where e.id = dept.manager_id), count(select em.id from employees as em where dept.id = em.dept_id) FROM departments as dept
        

        这应该可以,但是您没有提供您正在使用的特定数据库。如果你更新你的问题或告诉什么数据库,如果它不起作用,我可以编辑到那个数据库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-16
          • 2010-11-06
          • 2021-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-22
          • 1970-01-01
          相关资源
          最近更新 更多