【SQL】多行转一列 FOR XML PATH

CREATE TABLE TEST6
(
NAME VARCHAR(200),
ENTRY_DATE DATE,
COMPANY VARCHAR(200)
)

INSERT INTO TEST6 VALUES('王强','2008-1-1','电信');
INSERT INTO TEST6 VALUES('王强','2009-1-1','移动');
INSERT INTO TEST6 VALUES('王强','2010-1-1','联通');
INSERT INTO TEST6 VALUES('李四','2008-1-1','电网');
INSERT INTO TEST6 VALUES('李四','2009-1-1','财政局');
INSERT INTO TEST6 VALUES('张三','2012-12-1','腾讯');
INSERT INTO TEST6 VALUES('张三','2013-12-1','阿里');
INSERT INTO TEST6 VALUES('张三','2014-12-1','美团');
INSERT INTO TEST6 VALUES('张三','2015-12-1','饿了么');

测试表结构如上:

现在需要知道每个员工的任职次序

此时就用到了  FOR XML PATH函数

select COMPANY from TEST6 where NAME = '王强' for xml path('')

查询结果:

如果在path中给个参数

select COMPANY from TEST6 where NAME = '王强' for xml path('node')

查询结果:

可以看出,原来的节点增加了Node的标签

select COMPANY as myCom from TEST6 where NAME = '王强' for xml path('node')

 可以看出子节点的标签名也被改了

那如果不想要xml格式的,也可以用以下方法代替

SELECT '[ '+ COMPANY +' ]' FROM TEST6 where NAME = '王强' FOR XML PATH('')

查询结果如下:

最后拿出我们需要的结果

SELECT B.Name,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT Name,
(SELECT COMPANY+',' FROM TEST6 
  WHERE Name=A.Name 
  FOR XML PATH('')) AS StuList
FROM TEST6 A 
GROUP BY Name
) B

查询结果

参考自:https://www.cnblogs.com/yasuo2/p/6433697.html

另外看到一篇:SQL Server 行转列,列转行。多行转成一列

原文地址:https://www.cnblogs.com/yhnet/p/12660567.html