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

简介: 本文转载于T-Sql:字符串分组聚合,也许你还有更简单的办法?         今天在看订阅的RSS的时候,看到这么一个问题:T-Sql中如何对分组的信息进行聚合,并以逗号连接字符;也就是对一个表中的某个字段进行分组,然后对另一个字段聚合,如果表达得不太清楚,请看下面的表。
本文转载于 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 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编程中。

目录
相关文章
|
9天前
|
SQL
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
7 0
|
28天前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
28 0
|
1月前
|
SQL 数据库
数据库sql语句分组
在SQL中,`GROUP BY`语句用于将多行数据根据一个或多个列进行分组,以便可以对每个分组执行聚合函数,如计数、求和、求平均等。以下是一些基本的SQL分组示例。 1. **基本分组**
|
2月前
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
|
2月前
|
SQL HIVE
【Hive SQL 每日一题】分组排名取值
创建了一个名为`sales_data`的测试表,包含商品ID、销售额和销售日期。展示了部分示例数据。接着,提供了三个SQL查询:1) 查找每个商品销售额最高的记录;2) 获取每个商品最近和最远的销售记录;3) 求每个商品距今第二近的销售记录。每个查询都利用了窗口函数来处理数据,并给出了相应的查询结果图。
|
2月前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
|
2月前
|
SQL 关系型数据库 MySQL
SQL脚本字符串替换
【5月更文挑战第3天】
36 4
|
2月前
T-sql 高级查询( 5*函数 联接 分组 子查询)
T-sql 高级查询( 5*函数 联接 分组 子查询)
|
2月前
|
SQL
sql server模糊查询、分组
sql server模糊查询、分组
|
2月前
|
分布式计算 资源调度 Hadoop
Flink报错问题之Sql往kafka表写聚合数据报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。