Sql 查询每个部门最近聘用的员工
表架构:Sql 查询每个部门最近聘用的员工,sql,sql-server,select,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, S
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
)
Deptno
在dept
和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,第16级,状态1,第1行将varchar值'ashish'转换为数据类型int时,转换失败
你的错误来自这一部分
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
如果您需要有关员工分组的任何其他详细信息,那么这可能不是一个好办法。window函数应该可以实现以下功能:
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
将
e.DEPTNO
更改为CAST(e.DEPTNO作为varchar(max))
;)。