SQL字符串的分组聚合(ZT)

本文转载于T-Sql:字符串分组聚合,也许你还有更简单的办法?    

    今天在看订阅的RSS的时候,看到这么一个问题:T-Sql中如何对分组的信息进行聚合,并以逗号连接字符;也就是对一个表中的某个字段进行分组,然后对另一个字段聚合,如果表达得不太清楚,请看下面的表。

原表:

Parent
Child
Charles William
Charles Harry
Anne Peter
Anne Zara
Andrew Beatrice
Andrew Eugenie

处理后的结果: 

Parent
Children
Charles William,Harry
Anne Peter,Zara
Andrew Eugenie,Beatrice

     貌似很简单,以我的思考,先写一个聚合函数,然后再查询语句里面调用这个聚合函数;实际上还有更简单的办法,这是作者给出的解决办法,没有用到自定义聚合函数,他用的是FOR XML PATH(‘’)这样的处理方式,感觉真是爽

with t 
as(
select
'Charles' parent,
'William' child
union
select
'Charles',
'Harry'
union
select
'Anne',
'Peter'
union
select
'Anne',
'Zara'
union
select
'Andrew',
'Beatrice'
union
select
'Andrew',
'Eugenie'

)

SELECT parent,
STUFF( (
SELECT ','+ child

                        FROM t a

                        WHERE b.parent
= a.parent
                        FOR XML PATH('')),1
,1,
'')  children
FROM t b
GROUP
BY parent

复制代码

复制代码

如果你还有其他的解决办法,希望你也能给出你的答案, 多多益善

考虑到不熟悉STUFF()这个函数,故根据这个思路自己写了另外的方法:

select  parent,right(list,len(list)-1)
from
(
select parent,
(SELECT ','+ children
                        FROM t a  
                        where a.parent=b.parent                      

                        FOR XML PATH(''))
as list
from t b
group by parent
) x

复制代码

最终查询出来的结果集和使用上面的Stuff函数是一样的.

另外补充一下关于Stuff函数的用法:

/*
用法描述:
Stuff(expression1_Str,startIndex,lengthInt,expression2_Str)函数共有四个参数,其功能是将expression1_Str中自startIndex位置起删除lengthInt个字符,然后将expression2插入到expression1_Str中的startIndex位置。
*/

select 'abcdefg'
select STUFF('abcdefg',1,0,'1234') --结果为'1234abcdefg'
select STUFF('abcdefg',1,1,'1234') --结果为'1234bcdefg'
select STUFF('abcdefg',2,1,'1234') --结果为'a1234cdefg'
select STUFF('abcdefg',2,2,'1234') --结果为'a1234defg'

--一般的程序设计语言和Sql语言一样,都把字符串当作字符数组处理,但一个差别在于,大多数程序设计语言的数组下标起始位为0,而Sql Server中为1,由于惯性思维,常常把一般程序设计语言中的0起始位带至SQL编程中。

时间: 2025-01-28 08:01:23

SQL字符串的分组聚合(ZT)的相关文章

SSRS:使用带参数的 MDX 查询实现一个分组聚合功能的报表

基于数据仓库上的 SSRS 报表展示,一般可以直接通过 SQL 查询,存储过程,视图或者表等多种方 式将数据加载并呈现在报表中.但是如果是基于 Cube 多维数据集的数据查询,就不能再使用 SQL 的语 法了而应该使用 MDX 查询.关于 MDX 和其它 SSRS 的文章,请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 这是我们要实现的报表效果,使用的数据库示例是 MDX Step by Step 2008 的 SSAS DEMO 数据库. 收

SSRS:报表中分组聚合的展开和收起效果与处理不规则层次结构的技巧

报表中分组聚合的展开和收起效果与处理不规则层次结构的技巧(没有子元素的时候不展开, 删除+符号) 分组聚合的展开和收起效果在SSRS Report中非常常用,并且有时还要处理一些比较特别的情况.比 如分组合并时有的层次结构是不规则的,有的组有两层,遇到这种情况应该如何处理? 注意到下面的这个需求,如果 France 下面没有其它的子层级,就不显示 + 号,如果 United States - Utah/Minnesota 州没有城市的子层次那么它们也不显示 + 号. 这样的需求在 SSRS Re

SQL的排序,分组,统计常用语句

  SQL的排序,分组,统计常用语句: 1.使用排序使数据有序 通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,这个分组时排序的结果,并不是真的分组.ORDER BY显示每条记录而分组可能代表很多记录. 2.进行分组除去重复值 排序和分组之间的最大区别是:排序的数据显示所有记录(在限定标准范围之内),而分组数据不是显示所有记录.GROUP BY语句对于同样的值只显示一条记录.例如,下面的语句中的GRO

Sequelize中用group by进行分组聚合查询_node.js

一.SQL与Sequelize中的分组查询 1.1 SQL中的分组查询 SQL查询中,通GROUP BY语名实现分组查询.GROUP BY子句要和聚合函数配合使用才能完成分组查询,在SELECT查询的字段中,如果没有使用聚合函数就必须出现在ORDER BY子句中.分组查询后,查询结果为一个或多个列分组后的结果集. GROUP BY语法 SELECT 列名, 聚合函数(列名) FROM 表名 WHERE 列名 operator value GROUP BY 列名 [HAVING 条件表达式] [W

mssql sql 字符串截取实例代码

mssql sql 字符串截取实例代码 关于字符串截取我们用substring函数 substring   (   expression   ,   start   ,   length   )   返回字符.binary.text   或   image   表达式的一部分. 参数 expression 是字符串.二进制字符串.text.image.列或包含列的表达式.不要使用包含聚合函数的表达式. start 是一个整数,指定子串的开始位置. length 是一个整数,指定子串的长度(要返回

检查sql字符串中是否有单引号,有则进行转化

字符串 <% rem 检查sql字符串中是否有单引号,有则进行转化function CheckStr(str)dim tstr,l,i,chl=len(str)for i=1 to lch=mid(str,i,1)if ch="'" thentstr=tstr+"'"end iftstr=tstr+chnextCheckStr=tstrend function%></P><P>以上资料由动网先锋(http://www.aspsky

检查sql字符串中是否有单引号,有则进行转化.

<%   rem 检查sql字符串中是否有单引号,有则进行转化   function CheckStr(str)       dim tstr,l,i,ch   l=len(str)   for i=1 to l       ch=mid(str,i,1)       if ch="'" then      tstr=tstr+"'"   end if   tstr=tstr+ch   next   CheckStr=tstr   end function%&

SqlServer中如何用exec处理sql字符串中含有变量

提示:必须声明标量变量@ declare @tssj nvarchar(100) -- 外部变量 declare @Sql_Sql nvarchar(100) -- 存sql字符串变量 set @Sql_Sql =N'select @tssj=jpk from b where bzmc=''中国''' EXEC sp_executesql @Sql_Sql,N'@tssj int output',@tssj output select @tssj N'@tssj int output',@tss

如何筛选SQL字符串字段中部分值

如果需要筛选SQL字符串字段中部分值,应该怎么做呢?下面就教您筛选SQL字符串字段中部分值的记录的方法,供您参考. 例如有一个KKBH(卡口编号)字段,这是一个字典字段(对应另一个实体表(卡口表)的编号字段).这个字段的值保存所属卡口值域{01,02,03} 本来想到的是通过or来实现,这样需要动态生成SQL语句. 后来想到一个办法用charindex搜索SQL字符串的办法.将所有的要查的卡口编号组成类似'01@02'这样待查字符串.sql查询时通过charindex筛选出在待查SQL字符串里有