首页 > 解决方案 > SQL Server:需要旋转一些列

问题描述

我在 SQL Server 2016 中有一个 HR 系统。我需要从员工表(如下所示)构建一个结果集(表)。这个想法是识别员工拥有的所有姓名并将其转入单个列。最常见的情况是一个人结婚然后改变她的姓氏。

emp_number  emp_fname   emp_lname
----------------------------------
1            Marilyn    Jones
2            Joan       Smith
3            Jean       Robinson
4            Shelia     Hayes
4            Shelia     Mclean
4            Shelia     Taylor
5            Heather    Iles
6            Lisa       Norman
7            Andrea     Plant
7            Andrea     Clancy

我需要为每个 emp_number 设置一行。在该行中,如果 emp 编号有多个记录,则旋转 emp_fname 和 emp_lname,连接这些字段,然后写入单个记录。下表是我的目标

emp_number  emp_name_concat
-----------------------------
1           Marilyn Jones
2           Joan Smith
3           Jean Robinson
4           Shelia Hayes , Shelia Mclean , Shelia Taylor 
5           Heather Iles
6           Lisa Norman 
7           Andrea Plant, Andrea Clancy

我正在查看枢轴示例,但它们似乎显示了要旋转的行数已知的场景。从理论上讲,一个人可以多次更改姓氏。而且,不需要对所有行进行旋转。

任何建议将不胜感激,

谢谢

标签: sql-serverpivot

解决方案


由于您使用的是 2016 版本,因此您无法使用STRING_AGG()......也许以下内容会起作用。

DECLARE @Table TABLE (emp_number INT, emp_fname NVARCHAR(100), emp_lname NVARCHAR(100))
INSERT @Table VALUES
(1,'Marilyn'    ,'Jones'),
(2,'Joan'       ,'Smith'),
(3,'Jean'       ,'Robinson'),
(4,'Shelia'     ,'Hayes'),
(4,'Shelia'     ,'Mclean'),
(4,'Shelia'     ,'Taylor'),
(5,'Heather'    ,'Iles'),
(6,'Lisa'       ,'Norman'),
(7,'Andrea'     ,'Plant'),
(7,'Andrea'     ,'Clancy')



SELECT DISTINCT
  t.emp_number,
  STUFF
  ((
    SELECT ', ' + t2.emp_fname + ' ' + t2.emp_lname
      FROM @Table t2
      WHERE t2.emp_number = t.emp_number
      FOR XML PATH('')
  ), 1, 2, N''
  ) AS emp_name_concat
FROM @Table t
ORDER BY t.emp_number;

推荐阅读