sql关于group by之后把每一条记录的详情的某个字段值合并提取的方法

 

在利用group by写了统计语句之后,还有一个查看每一个记录详情的需求,

首先想到的是根据group by的条件去拼接查询条件,

但是条件有点多,拼接起来不仅麻烦,还容易出错,

所以想到要在group by之后同时把详情记录的ID给拼接成逗号分隔的字符串(‘1’,‘2’,‘3’)这种形式,这样再去取详情记录就很简单了

还是万能的博客园里面找到的方法:

select
  route_code,domain_id,type_id,COUNT(id0) as cnt,
     stuff(
     (        
     ----stuff函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符
         select ','+cast(id0 as varchar)---字段拼接
         from PMS_T_D_AssetInfo t  
         where t.route_code=PMS_T_D_AssetInfo.route_code  
         and t.domain_id=PMS_T_D_AssetInfo.domain_id
         and t.type_id=PMS_T_D_AssetInfo.type_id   
         for xml path('')
     )
     , 1, 1, '') as idStr
     --stuff将参数4的空字符串在参数1字符串的第1个(参数2)字符位置起替换掉1(参数3)个长度
from  
PMS_T_D_AssetInfo 
group by 
route_code,domain_id,type_id

得到的结果如下:

效果看上去很好,

但是,

统计数据大了之后,这个拼接字段会非常长,最后想想还是算了,还不如我直接拼接查询条件呢,

但是,这个方法还是不错的,在拼接字段明确有限的情况下可以用!

最后,

附上新认识的stuff函数简介:

一、作用

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

 

二、语法

STUFF ( character_expression , start , length ,character_expression )

参数


character_expression
一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。

start
一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。

length
一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。length 可以是 bigint 类型。

 

返回类型
如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。

 

示例:

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'

 

posted @ 2017-11-26 09:49  风谷逍遥客  阅读(18948)  评论(2编辑  收藏  举报