在单个查询中选择每个部门的TOP指定员工

时间:2017-08-01 10:41:23

标签: sql-server

如何找到每个部门的最高指定员工?

我有这个表和值:

venv

以下是我尝试的查询:

 CREATE TABLE [dbo].[#deptartment]
(
  [emp_id] [INT] IDENTITY(1, 1) NOT NULL,
  [dept_name] [VARCHAR](100) NULL,
  [emp_name] [VARCHAR](50) NULL ,
  [desig] [VARCHAR](100) NULL
)
ON  [PRIMARY]
GO

INSERT INTO #deptartment  VALUES ('IT','JAFFERY','DIRECTOR')
INSERT INTO #deptartment  VALUES ('DEVELOPMENT','CORBIT','PROGRAMMER')
INSERT INTO #deptartment  VALUES ('DEVELOPMENT','CHANDRA','DBA')
INSERT INTO #deptartment  VALUES ('IT','KEVIN','MANAGER')
INSERT INTO #deptartment  VALUES ('IT','ROBERT','SUPERVISOR')
INSERT INTO #deptartment  VALUES ('QA','NOMAN','ANALYST')
INSERT INTO #deptartment  VALUES ('ADMIN','CORE','RECEPTIONIST')
INSERT INTO #deptartment  VALUES ('QA','MADDEN','ANALYST')
INSERT INTO #deptartment  VALUES ('IT','NORRIS','TECHNICIAN')
INSERT INTO #deptartment  VALUES ('ADMIN','PATRICK','CLERK')
 INSERT INTO #deptartment  VALUES ('DATA','SONJA','SUPERVISOR')
 INSERT INTO #deptartment  VALUES ('QA','GEORGE','MANAGER')
 INSERT INTO #deptartment  VALUES ('ADMIN','EMILLY','MANAGER')
 INSERT INTO #deptartment  VALUES ('QA','PATRICK','TESTER')
 INSERT INTO #deptartment  VALUES ('DEVELOPMENT','ABDUL','MANAGER')
 INSERT INTO #deptartment  VALUES ('DATA','PATRICK','CLERK')
 INSERT INTO #deptartment  VALUES ('ADMIN','GEORGE','CLERK')
 INSERT INTO #deptartment  VALUES ('DEVELOPMENT','YURIY','SUPERVISOR')
 INSERT INTO #deptartment  VALUES ('DATA','GRAHAM','OPERATOR')

1 个答案:

答案 0 :(得分:0)

您正在寻找条件排名/订单。请注意order by case声明。您需要完成此声明,以根据最高指定员工的定义放置desig的顺序。我对前三个做了一些假设,但是请确保为desig

的每个唯一值列出所有假设。
select
    x.emp_id
    ,x.dept_name
    ,x.emp_name
from(
    select
        d.emp_id
        ,d.dept_name
        ,d.emp_name
        ,row_number() over (partition by d.dept_name order by case 
                                                                when d.desig = 'DIRECTOR' then 1
                                                                when d.desig = 'SUPERVISOR' then 2
                                                                when d.desig = 'OPERATOR' then 3
                                                                --etc...
                                                                end) as RN
    from #deptartment d) x
where x.RN = 1