SQL中FOR XML PATH 语句[可用于分组统计]

FOR XML PATH 语句 :(应该在sql2005及以上版本才能用)

declare @t table(id int,name varchar)
insert into @t(id,name) values(1,'a')
insert into @t(id,name) values(2,'b')

select id,name from @t for xml path

运行结果如下:

<row>
  <id>1</id>
  <name>a</name>
</row>
<row>
  <id>2</id>
  <name>b</name>
</row>

 

select id,name from @t for xml path('node')

运行结果如下:

<node>
  <id>1</id>
  <name>a</name>
</node>
<node>
  <id>2</id>
  <name>b</name>
</node>

下面我要做一个分组统计:

declare @student table(class varchar(10),name varchar(10))
insert into @student(class,name) values('1班','张三')
insert into @student(class,name) values('2班','李四')
insert into @student(class,name) values('1班','王五')
insert into @student(class,name) values('2班','郭佳')
insert into @student(class,name) values('3班','吴亮')

select
class,
STUFF((select ','+name from @student where class=stu.class for xml path('')),1,1,'') names
from @student stu
group by class
order by class

运行结果如下:

1班   张三,王五
2班   李四,郭佳
3班   吴亮

同样的效果还可以换一种方式实现:

select class,RIGHT(names,LEN(names)-1) from
(
	select
	class,
	(select ','+name from @student where class=stu.class for xml path('')) names
	from @student stu
	group by class

) stu
order by class

运行结果如下:

1班   张三,王五
2班   李四,郭佳
3班   吴亮

 

STUFF用法

1、作用

删除指定长度的字符,并在指定的起点处插入另一组字符。

2、语法

STUFF ( character_expression , start , length ,character_expression )

3、示例

以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串

SELECT STUFF('abcdef', 2, 3, 'ijklmn')
GO

下面是结果集

aijklmnef

 

 

 

 

 

时间: 2024-10-23 10:55:40

SQL中FOR XML PATH 语句[可用于分组统计]的相关文章

灵活运用 SQL SERVER FOR XML PATH

原文:灵活运用 SQL SERVER FOR XML PATH         FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主.         一.FOR XML PATH 简单介绍              那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:        

在SQL中生成XML文本

 在SQL中自定义XML的根节点和子节点 select * from table FOR XML PATH('child'),ROOT('parent') 多表查询一个主表一个子表的话 select *, (select * from subTable where subTable.id=master.id FOR XML PATH('child'),ROOT('parent'),TYPE ) from master FOR XML PATH('child'),ROOT('parent')

基于SQL中的数据查询语句汇总

以下是对SQL中的数据查询语句进行了汇总介绍,需要的朋友可以过来参考下   where条件表达式 --统计函数 复制代码 代码如下: Select count(1) from student; --like模糊查询 --统计班上姓张的人数 复制代码 代码如下: select count(*) from student where realName like '张%'; --统计班上张姓两个字的人数 复制代码 代码如下: select count(*) from student where rea

【T-SQL系列】FOR XML PATH 语句的应用

原文:[T-SQL系列]FOR XML PATH 语句的应用 DECLARE @TempTable TABLE ( UserID INT , UserName NVARCHAR(50) ); INSERT INTO @TempTable ( UserID, UserName ) VALUES ( 1, 'a' ) INSERT INTO @TempTable ( UserID, UserName ) VALUES ( 2, 'b' ) SELECT UserID , UserName FROM

SQL Server 中 ROR XML PATH 用法

 FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主.     一.FOR XML PATH 简单介绍     那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:     接下来我们来看应用FOR XML PATH的查询结果语句如下:     SELECT * FROM @hobb

SQL SERVER FOR XML PATH 行转列实例详解

FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主. 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:        接下来我们来看应用FOR XML PATH的查询结果语句如下:  代码如下 复制代码 SELECT * FROM @hob

sqlserver FOR XML PATH 语句的应用_mssql2005

复制代码 代码如下: DECLARE @TempTable table(UserID int , UserName nvarchar(50)); insert into @TempTable (UserID,UserName) values (1,'a') insert into @TempTable (UserID,UserName) values (2,'b') select UserID,UserName from @TempTable FOR XML PATH 运行这段脚本,将生成如下结

sql server如何利用开窗函数over()进行分组统计_MsSql

这是一道常见的面试题,在实际项目中经常会用到. 需求:求出以产品类别为分组,各个分组里价格最高的产品信息. 实现过程如下: declare @t table( ProductID int, ProductName varchar(20), ProductType varchar(20), Price int) --测试数据 insert @t select 1,'name1','P1',3 union all select 2,'name2','P1',5 union all select 3,

sql server如何利用开窗函数over()进行分组统计

这是一道常见的面试题,在实际项目中经常会用到. 需求:求出以产品类别为分组,各个分组里价格最高的产品信息. 实现过程如下: declare @t table( ProductID int, ProductName varchar(20), ProductType varchar(20), Price int) --测试数据 insert @t select 1,'name1','P1',3 union all select 2,'name2','P1',5 union all select 3,