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,'') --结果为'1234abcdefg'
select STUFF('abcdefg',1,1,'') --结果为'1234bcdefg'
select STUFF('abcdefg',2,1,'') --结果为'a1234cdefg'
select STUFF('abcdefg',2,2,'') --结果为'a1234defg'
sql关于group by之后把每一条记录的详情的某个字段值合并提取的方法的更多相关文章
- SQL 一条记录的的两个字段值相同与不同的查询
select * from (select xm,je from table) a , (select xm01,je01 from table) bwhere a.xm = b.xm01and a. ...
- 通过sql的stuff 把一列几行的记录拼接在一行一个字段
---通过sql的stuff 把一列几行的记录拼接在一行一个字段 select FID,a.FCustomerID as 工地ID , 应验收节点 = (stuff((select ',' + isn ...
- Sql语句groupBY分组后取最新一条记录的SQL
一.问题 groupBY分组后取最新一条记录的SQL的解决方案. 二.解决方案 select Message,EventTime from PT_ChildSysAlarms as a where E ...
- SQL SERVER 2008 字段值合并
/** * 通过 FOR XML PATH 语句,可以将字段的值进行合并. **/ CREATE TABLE tb_child ( name ), hobby ) ) go INSERT INTO t ...
- SQL 分组获取最近(大)一条记录
SELECT MAX( table.Column),.... FROM table.Name WHERE ....... GROUP BY 分组规则
- sql 中实现往表中插入一条记录并返回当前记录的ID
写一条存储过程,实现往User中插入一条记录并返回当前UserId(自增长id) --推荐写法 if(Exists(select * from sys.objects where name=N'Usp ...
- 【ORACLE】SQL查询出每个组中的第一条记录
CREATE TABLE [TestTable] ( ) NOT NULL , ) NOT NULL , ) ))) GO ALTER TABLE [TestTable] ADD PRIMARY KE ...
- 删除oracle 表中重复数据sql语句、保留rowid最小的一条记录
delete from tablename a where rowid > ( select min(rowid) from table_name b where b.id = a.id and ...
- sql server 更新满足条件的某一条记录
上图数据:SNum为”18004XXXXX000001K2GW 4000 L1C“,OffLineStation为“OP1010”的有两条数据,当where条件中为上述两者时会同时更新这两条数据,并不 ...
随机推荐
- 进阶的Redis之哈希分片原理与集群实战
前面介绍了<进阶的Redis之数据持久化RDB与AOF>和<进阶的Redis之Sentinel原理及实战>,这次来了解下Redis的集群功能,以及其中哈希分片原理. 集群分片模 ...
- oracle数据库,mybatis批量insert,缺失values字段
报错:### Error updating database. Cause: java.sql.SQLException: ORA-00926: 缺失 VALUES 关键字### The error ...
- Very Good!——C语言初学者百题大战之二
#include<stdio.h> int main() { printf("***************\n\n Very Good!\n\n***************& ...
- 20172333 2017-2018-2 《Java程序设计》第9周学习总结
20172333 2017-2018-2 <Java程序设计>第9周学习总结 教材学习内容 第十一章 异常与错误均是对象 异常是由代码的特定方法或者操作出错. 错误是代码运行中虚拟机出现错 ...
- opencv Mat 像素操作
1 cv::Mat cv::Mat是一个n维矩阵类,声明在<opencv2/core/core.hpp>中. class CV_EXPORTS Mat { public: //a lo ...
- 用CRF++开源工具做文本序列标注教程
本文只介绍如何快速的使用CRF++做序列标注,对其中的原理和训练测试参数不做介绍. 官网地址:CRF++: Yet Another CRF toolkit 主要完成如下功能: 输入 -> &qu ...
- ElasticSearch调优问题
1. 近期遇到一个ES内存居高不下的问题,查了查,发现ES有个fielddata,当你发起一个查询,分析字符串的聚合将会被加载到 fielddata,如果这些字符串之前没有被加载过.如果结果中 fie ...
- asp.net <%%> <%#%><%=%><%@%><%$%>用法区别
asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别 1.<% %> ...
- RMAN冗余备份概念与方法
冗余备份概念 RMAN提供了一种更谨慎的备份策略:duplexed方式备份,其实质就是在生成备份集的同时,向指定位置copy指定份数(最大不超过4)的备份集复制,以避免在灾难性事故时数据库损坏和备份丢 ...
- python中常用第三方库记录
python中有很多很好用的第三方库,现在记录一下这些库以及如何下载 一.virtualenv,这是一个可以将生产环境隔离开的python库,非常好用 在linux下使用pip install vir ...