查询每个部门中最近雇用的员工

时间:2015-05-16 11:02:10

标签: sql sql-server select

表架构:

create table dept 
( 
     DEPTNO int NOT NULL, 
     DNAME VARCHAR(14), 
     LOC VARCHAR(13)
)

create table emp 
(
     EMPNO int primary key, 
     ENAME VARCHAR(1000), 
     JOB VARCHAR(1000), 
     MGR int, 
     HIREDATE DATETIME, 
     SAL decimal(15, 5), 
     COMM decimal(20, 5), 
     DEPTNO int
)
Deptnodept表中的

emp处于主要和外键关系

问题:找到每个部门中最近雇用的员工。

查询:

SELECT 
    convert(varchar(50), e.ENAME + ',' + e.DEPTNO),
    MAX(hiredate) 
FROM
    emp e  
JOIN
    dept d ON e.deptno = d.deptno 
GROUP BY
    convert(varchar(50), e.ENAME + ',' + e.DEPTNO)

我收到错误:

  

Msg 245,Level 16,State 1,Line 1
  将varchar值'ashish'转换为数据类型int。

时转换失败

2 个答案:

答案 0 :(得分:4)

你的错误来自这部分; e.ENAME + ',' + e.DEPTNO您尝试使用+运算符添加两种不同类型的字段,因此您需要正确使用convert,如下所示:e.ENAME + ',' + CONVERT(VARCHAR(50), e.DEPTNO)

但是为了回答你的问题,你需要另一种类型的查询:

SELECT TOP(1) 
    e.ENAME + ',' + CONVERT(VARCHAR(50), e.DEPTNO)
FROM
    dept d
    LEFT OUTER JOIN
    (SELECT *, ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY HIREDATE DESC) AS recentHired
     FROM emp) e ON d.DEPTNO = e.DEPTNO
ORDER BY
    e.recentHired

答案 1 :(得分:4)

如果您需要有关员工分​​组的任何其他详细信息可能不是可行的方法。 rank窗口函数应该可以解决这个问题:

SELECT *
FROM   (SELECT e.*, 
               dname, 
               RANK() OVER (PARTITION BY e.deptno ORDER BY hiredate DESC) AS rk
        FROM   emp e
        JOIN   dept d ON e.deptno=d.deptno) t
WHERE  rk = 1