1.在处理数据查询时,有时需要将多行数据合并到一行里,或者将一行里的数据拆分处理,下面来看看例子:
如你有一组数据:
ID name
1212 大西装
1212 小西装
我们需要将结果显示为:
ID name
1212 大西装,小西装
创建测试数据:
select * from #2
DROP TABLE #2
create table #2
(id int,
name nvarchar(max))
insert into #2
select 1212,N'小西装' union all
select 1212,N'大西装'
实现方法:
select id,
(STUFF((select ','+name from #2 a where a.id=b.id for xml path ('')),1,1,''))as name
from #2 b
group by id
备注:
1、计算列可以不用包含在聚合函数中而直接显示,如下面语句的val。
2、for xml path('') 应该应用于语句的最后面,继而生成xml。
3、for xml path('root')中的path参数是生成的xml最顶级节点。
4、字段名或是别名将成为xml的子节点,对于没有列名(字段+'')或是没有别名的字段将直接显示。如[value] +','则是用,分隔的数据(aa,bb,)。
5、对于合并多行数据显示为一行数据时使用自连。
STUFF:是删除指定长度的字符,并在指定的起点处插入另一组字符
语法:
STUFF ( character_expression , start , length ,character_expression )
如:SELECT STUFF('abcdef', 2, 3, 'ijklmn')
下面是结果集 :aijklmnef
以上实现了并接的效果,但如果你本身的数值就是并接的,如何拆分呢?
创建测试数据:
create table #2(id int,name Nvarchar(100))
insert into #2 values(1212,N'小西装,大西装')
实现代码:
SELECT A.id, B.name
FROM(
SELECT id, [name] = CONVERT(xml,' <root> <v>' + REPLACE([name], ',', ' </v> <v>') + ' </v> </root>') FROM #2
)A
OUTER APPLY(
SELECT name = N.v.value('.', 'varchar(100)') FROM A.[name].nodes('/root/v') N(v)
)B
结果集:
ID name
1212 大西装
1212 小西装