如何用SQL将指定企业的Director、Manager、Sales信息按行展示?
解决方案
你要实现的是把Corporate表中同一企业的三个职位ID列拆分成多行记录(每行对应一个职位+员工信息),这属于列转行操作——PIVOT是用来做行转列的,所以这里得用UNPIVOT或者UNION ALL来搞定,以下是具体实现方案:
方法1:用UNION ALL拆分列
这种方式逻辑直白,容易理解,就是分别查询三个职位的员工信息再合并结果:
SELECT 'Director' AS Position, e.FirstName, e.LastName FROM Corporate c JOIN Employee e ON c.DirectorId = e.EmployeeId WHERE c.CorporateId = 3 UNION ALL SELECT 'Manager' AS Position, e.FirstName, e.LastName FROM Corporate c JOIN Employee e ON c.ManagerId = e.EmployeeId WHERE c.CorporateId = 3 UNION ALL SELECT 'Sales' AS Position, e.FirstName, e.LastName FROM Corporate c JOIN Employee e ON c.SalesId = e.EmployeeId WHERE c.CorporateId = 3
方法2:用UNPIVOT实现列转行
如果想用和PIVOT对应的反向操作,UNPIVOT可以直接把多列转换成多行结构:
SELECT upvt.Position, e.FirstName, e.LastName FROM ( -- 先把Corporate的三个职位ID列转成(职位,员工ID)的行格式 SELECT CorporateId, Position, EmployeeId FROM Corporate UNPIVOT ( EmployeeId FOR Position IN (DirectorId, ManagerId, SalesId) ) AS upvt WHERE CorporateId = 3 ) AS corp_unpivoted -- 关联Employee表获取员工姓名 JOIN Employee e ON corp_unpivoted.EmployeeId = e.EmployeeId
补充说明
- PIVOT的作用是把多行的同维度数据转成多列,和你当前的需求正好相反,所以不适用。
- 两种方法最终都会输出相同结果:针对企业3,每行显示一个职位以及对应的员工姓名。
内容的提问来源于stack exchange,提问作者refresh
相关产品推荐
相关产品推荐

