【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,饿了么);

测试表结构如上:

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

【SQL】多行转一列 FOR XML PATH

 

 

 

此时就用到了  FOR XML PATH函数

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

查询结果:

【SQL】多行转一列 FOR XML PATH

 

 

如果在path中给个参数

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

查询结果:

【SQL】多行转一列 FOR XML PATH

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

 

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

 

【SQL】多行转一列 FOR XML PATH

 

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

 

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

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

查询结果如下:

【SQL】多行转一列 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

查询结果

【SQL】多行转一列 FOR XML PATH

 

 

 

 

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

 

【SQL】多行转一列 FOR XML PATH

上一篇:MySQL分组查询(优化for循环)


下一篇:ORACLE 11.2.0.4安装(ORACLE LINUX 7 之01 准备)